home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Utilities / Programming / EnterAct 3.5 / hAWK project / AWK Source / AWKTAB.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-22  |  100.8 KB  |  3,182 lines  |  [TEXT/TOPC]

  1.  
  2. /*  A Bison parser, made from awk.y.
  3. This parser has not as yet been reYACC'ed for the Mac version
  4. -it works just fine. */
  5. /* Modified for THINK C 4 on the Mac by Ken Earle (Dynabyte) Aug 1991. */
  6.  
  7. #define    FUNC_CALL    258
  8. #define    NAME    259
  9. #define    REGEXP    260
  10. #define    ERROR    261
  11. #define    NUMBER    262
  12. #define    YSTRING    263
  13. #define    RELOP    264
  14. #define    APPEND_OP    265
  15. #define    ASSIGNOP    266
  16. #define    MATCHOP    267
  17. #define    NEWLINE    268
  18. #define    CONCAT_OP    269
  19. #define    LEX_BEGIN    270
  20. #define    LEX_END    271
  21. #define    LEX_IF    272
  22. #define    LEX_ELSE    273
  23. #define    LEX_RETURN    274
  24. #define    LEX_DELETE    275
  25. #define    LEX_WHILE    276
  26. #define    LEX_DO    277
  27. #define    LEX_FOR    278
  28. #define    LEX_BREAK    279
  29. #define    LEX_CONTINUE    280
  30. #define    LEX_PRINT    281
  31. #define    LEX_PRINTF    282
  32. #define    LEX_NEXT    283
  33. #define    LEX_EXIT    284
  34. #define    LEX_FUNCTION    285
  35. #define    LEX_GETLINE    286
  36. #define    LEX_IN    287
  37. #define    LEX_AND    288
  38. #define    LEX_OR    289
  39. #define    INCREMENT    290
  40. #define    DECREMENT    291
  41. #define    LEX_BUILTIN    292
  42. #define    LEX_LENGTH    293
  43. #define    UNARY    294
  44.  
  45. #line 26 "awk.y"
  46.  
  47. #ifdef DEBUG
  48. #define YYDEBUG 12
  49. #endif
  50.  
  51. #include "AWK.H"
  52.  
  53. /*
  54.  * This line is necessary since the Bison parser skeleton uses bcopy.
  55.  * Systems without memcpy should use -DMEMCPY_MISSING, per the Makefile.
  56.  * It should not hurt anything if Yacc is being used instead of Bison.
  57.  */
  58. #define bcopy(s,d,n)    memcpy((d),(s),(n))
  59.  
  60. extern void msg(char *va_alist, ...);
  61. extern struct re_pattern_buffer *
  62.     mk_re_parse(char *s, short ignorecase);
  63.  
  64. /* AWKTAB.C */
  65. short yyparse(void);
  66. static void yyerror(char *va_alist, ...);
  67. short parse_escape(char **string_ptr);
  68. static short yylex(void);
  69. static FILE *pathopen(char *file);
  70. static NODE *node_common(NODETYPE op);
  71. NODE *node(NODE *left, NODETYPE op, NODE *right);
  72. static NODE *snode(NODE *subn, NODETYPE op, NODE *(*procp) ());
  73. static NODE *mkrangenode(NODE *cpair);
  74. static NODE *make_for_loop(NODE *init, NODE *cond, NODE *incr);
  75. NODE *install(NODE **table, char *name, NODE *value);
  76. NODE *lookup(NODE **table, char *name);
  77. static short hashf(register char *name, register short len, short hashsize);
  78. static NODE *append_right(NODE *list, NODE *new);
  79. static void func_install(NODE *params, NODE *def);
  80. static void pop_var(NODE *np, short freeit);
  81. static void pop_params(NODE *params);
  82. static NODE *make_param(char *name);
  83. NODE *variable(char *name);
  84.  
  85. static short want_regexp;        /* lexical scanning kludge */
  86. static short want_assign;        /* lexical scanning kludge */
  87. static short can_return;        /* lexical scanning kludge */
  88. static short io_allowed = 1;    /* lexical scanning kludge */
  89. static short lineno = 1;        /* for error msgs */
  90. static char *lexptr;        /* pointer to next char during parsing */
  91. static char *lexptr_begin;    /* keep track of where we were for error msgs */
  92. static short curinfile = -1;    /* index into sourcefiles[] */
  93. static short param_counter;
  94.  
  95. NODE *variables[HASHSIZE];
  96.  
  97. extern short errcount;
  98. extern NODE *begin_block;
  99. extern NODE *end_block;
  100.  
  101. #line 77 "awk.y"
  102. typedef union {
  103.     long lval;
  104.     AWKNUM fval;
  105.     NODE *nodeval;
  106.     NODETYPE nodetypeval;
  107.     char *sval;
  108.     NODE *(*ptrval)();
  109. } YYSTYPE;
  110.  
  111. #ifndef YYLTYPE
  112. typedef
  113.   struct yyltype
  114.     {
  115.       short timestamp;
  116.       short first_line;
  117.       short first_column;
  118.       short last_line;
  119.       short last_column;
  120.       char *text;
  121.    }
  122.   yyltype;
  123.  
  124. #define YYLTYPE yyltype
  125. #endif
  126.  
  127. #define    YYACCEPT    return(0)
  128. #define    YYABORT    return(1)
  129. #define    YYERROR    goto yyerrlab
  130. #include <stdio.h>
  131.  
  132. #ifndef __STDC__
  133. #define const
  134. #endif
  135.  
  136.  
  137.  
  138. #define    YYFINAL        298
  139. #define    YYFLAG        -32768
  140. #define    YYNTBASE    61
  141.  
  142. #define YYTRANSLATE(x) ((unsigned)(x) <= 294 ? yytranslate[x] : 105)
  143.  
  144. static const char yytranslate[] = {     0,
  145.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  146.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  147.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  148.      2,     2,    49,     2,     2,    52,    48,     2,     2,    53,
  149.     54,    46,    44,    60,    45,     2,    47,     2,     2,     2,
  150.      2,     2,     2,     2,     2,     2,     2,    40,    59,    41,
  151.      2,    42,    39,     2,     2,     2,     2,     2,     2,     2,
  152.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  153.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  154.     55,     2,    56,    51,     2,     2,     2,     2,     2,     2,
  155.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  156.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  157.      2,     2,    57,    43,    58,     2,     2,     2,     2,     2,
  158.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  159.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  160.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  161.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  162.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  163.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  164.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  165.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  166.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  167.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  168.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  169.      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
  170.      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
  171.      6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
  172.     16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
  173.     26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
  174.     36,    37,    38,    50
  175. };
  176.  
  177. static const short yyrline[] = {     0,
  178.    136,   141,   149,   165,   166,   170,   172,   186,   188,   202,
  179.    208,   214,   216,   218,   220,   229,   231,   236,   240,   248,
  180.    257,   259,   268,   270,   281,   286,   291,   293,   301,   303,
  181.    308,   310,   316,   318,   320,   322,   324,   326,   328,   333,
  182.    337,   342,   345,   348,   350,   352,   355,   356,   358,   360,
  183.    362,   364,   369,   371,   376,   381,   388,   390,   395,   397,
  184.    402,   404,   409,   411,   413,   415,   420,   422,   427,   429,
  185.    431,   433,   435,   441,   443,   448,   450,   455,   457,   463,
  186.    465,   467,   469,   474,   476,   481,   483,   489,   491,   493,
  187.    495,   500,   503,   504,   506,   511,   520,   522,   524,   526,
  188.    528,   530,   532,   534,   536,   538,   540,   542,   547,   550,
  189.    551,   553,   555,   564,   566,   568,   570,   572,   574,   576,
  190.    578,   583,   585,   587,   589,   591,   593,   597,   599,   601,
  191.    603,   605,   607,   609,   613,   615,   617,   619,   621,   623,
  192.    625,   627,   632,   634,   639,   641,   643,   648,   652,   656,
  193.    660,   661,   665,   668
  194. };
  195.  
  196. /* In an application, this is OK
  197. static const char * const yytname[] = {     0,
  198. "error","$illegal.","FUNC_CALL","NAME","REGEXP","ERROR","NUMBER","YSTRING","RELOP","APPEND_OP",
  199. "ASSIGNOP","MATCHOP","NEWLINE","CONCAT_OP","LEX_BEGIN","LEX_END","LEX_IF","LEX_ELSE",
  200. "LEX_RETURN","LEX_DELETE",
  201. "LEX_WHILE","LEX_DO","LEX_FOR","LEX_BREAK","LEX_CONTINUE","LEX_PRINT","LEX_PRINTF",
  202. "LEX_NEXT","LEX_EXIT","LEX_FUNCTION",
  203. "LEX_GETLINE","LEX_IN","LEX_AND","LEX_OR","INCREMENT","DECREMENT","LEX_BUILTIN",
  204. "LEX_LENGTH","'?'","':'",
  205. "'<'","'>'","'|'","'+'","'-'","'*'","'/'","'%'","'!'","UNARY",
  206. "'^'","'$'","'('","')'","'['","']'","'{'","'}'","';'","','",
  207. "start"
  208. };
  209. */
  210. /* In  code resource, something horrible is needed - stop complaining, I did it for you...*/
  211. static char *yytname[62];
  212. void Inityytname(void);
  213. void Inityytname()
  214.     {
  215.     yytname[0] = (char *)0;
  216.     yytname[1] = "error";
  217.     yytname[2] = "$illegal.";
  218.     yytname[3] = "FUNC_CALL";
  219.     yytname[4] = "NAME";
  220.     yytname[5] = "REGEXP";
  221.     yytname[6] = "ERROR";
  222.     yytname[7] = "NUMBER";
  223.     yytname[8] = "YSTRING";
  224.     yytname[9] = "RELOP";
  225.     yytname[10] = "APPEND_OP";
  226.     yytname[11] = "ASSIGNOP";
  227.     yytname[12] = "MATCHOP";
  228.     yytname[13] = "NEWLINE";
  229.     yytname[14] = "CONCAT_OP";
  230.     yytname[15] = "LEX_BEGIN";
  231.     yytname[16] = "LEX_END";
  232.     yytname[17] = "LEX_IF";
  233.     yytname[18] = "LEX_ELSE";
  234.     yytname[19] = "LEX_RETURN";
  235.     yytname[20] = "LEX_DELETE";
  236.     yytname[21] = "LEX_WHILE";
  237.     yytname[22] = "LEX_DO";
  238.     yytname[23] = "LEX_FOR";
  239.     yytname[24] = "LEX_BREAK";
  240.     yytname[25] = "LEX_CONTINUE";
  241.     yytname[26] = "LEX_PRINT";
  242.     yytname[27] = "LEX_PRINTF";
  243.     yytname[28] = "LEX_NEXT";
  244.     yytname[29] = "LEX_EXIT";
  245.     yytname[30] = "LEX_FUNCTION";
  246.     yytname[31] = "LEX_GETLINE";
  247.     yytname[32] = "LEX_IN";
  248.     yytname[33] = "LEX_AND";
  249.     yytname[34] = "LEX_OR";
  250.     yytname[35] = "INCREMENT";
  251.     yytname[36] = "DECREMENT";
  252.     yytname[37] = "LEX_BUILTIN";
  253.     yytname[38] = "LEX_LENGTH";
  254.     yytname[39] = "'?'";
  255.     yytname[40] = "':'";
  256.     yytname[41] = "'<'";
  257.     yytname[42] = "'>'";
  258.     yytname[43] = "'|'";
  259.     yytname[44] = "'+'";
  260.     yytname[45] = "'-'";
  261.     yytname[46] = "'*'";
  262.     yytname[47] = "'/'";
  263.     yytname[48] = "'%'";
  264.     yytname[49] = "'!'";
  265.     yytname[50] = "UNARY";
  266.     yytname[51] = "'^'";
  267.     yytname[52] = "'$'";
  268.     yytname[53] = "'('";
  269.     yytname[54] = "')'";
  270.     yytname[55] = "'['";
  271.     yytname[56] = "']'";
  272.     yytname[57] = "'{'";
  273.     yytname[58] = "'}'";
  274.     yytname[59] = "';'";
  275.     yytname[60] = "','";
  276.     yytname[61] = "start";
  277.     }
  278.  
  279. static const short yyr1[] = {     0,
  280.     61,    62,    62,    62,    62,    64,    63,    65,    63,    63,
  281.     63,    63,    63,    63,    63,    66,    66,    68,    67,    69,
  282.     70,    70,    72,    71,    73,    73,    74,    74,    74,    74,
  283.     75,    75,    76,    76,    76,    76,    76,    76,    76,    76,
  284.     76,    76,    76,    76,    76,    77,    76,    76,    78,    76,
  285.     76,    76,    79,    79,    80,    80,    81,    81,    82,    82,
  286.     83,    83,    84,    84,    84,    84,    85,    85,    86,    86,
  287.     86,    86,    86,    87,    87,    88,    88,    89,    89,    89,
  288.     89,    89,    89,    90,    90,    91,    91,    91,    91,    91,
  289.     91,    93,    92,    92,    92,    92,    92,    92,    92,    92,
  290.     92,    92,    92,    92,    92,    92,    92,    92,    95,    94,
  291.     94,    94,    94,    94,    94,    94,    94,    94,    94,    94,
  292.     94,    96,    96,    96,    96,    96,    96,    96,    96,    96,
  293.     96,    96,    96,    96,    96,    96,    96,    96,    96,    96,
  294.     96,    96,    97,    97,    98,    98,    98,    99,   100,   101,
  295.    102,   102,   103,   104
  296. };
  297.  
  298. static const short yyr2[] = {     0,
  299.      3,     1,     2,     1,     2,     0,     3,     0,     3,     2,
  300.      2,     2,     1,     2,     2,     1,     1,     0,     7,     3,
  301.      1,     3,     0,     4,     3,     4,     1,     2,     1,     2,
  302.      1,     2,     2,     2,     3,     1,     6,     8,     8,    10,
  303.      9,     2,     2,     6,     4,     0,     3,     3,     0,     4,
  304.      6,     2,     1,     1,     6,     9,     1,     2,     0,     1,
  305.      0,     2,     0,     2,     2,     2,     0,     1,     1,     3,
  306.      1,     2,     3,     0,     1,     0,     1,     1,     3,     1,
  307.      2,     3,     3,     0,     1,     1,     3,     1,     2,     3,
  308.      3,     0,     4,     5,     4,     3,     3,     3,     3,     1,
  309.      2,     3,     3,     3,     3,     5,     1,     2,     0,     4,
  310.      3,     3,     3,     1,     2,     3,     3,     3,     5,     1,
  311.      2,     2,     3,     4,     4,     1,     4,     2,     2,     2,
  312.      2,     1,     1,     1,     3,     3,     3,     3,     3,     3,
  313.      2,     2,     0,     1,     1,     4,     2,     2,     2,     1,
  314.      0,     1,     1,     2
  315. };
  316.  
  317. static const short yydefact[] = {    59,
  318.     57,    60,     0,    58,     4,     0,   145,   133,   134,     6,
  319.      8,    18,   143,     0,     0,     0,   126,     0,     0,    23,
  320.      0,     0,     0,    59,     0,     2,     0,     0,   100,    13,
  321.     21,   107,   132,     0,     0,     0,   153,     0,    10,    31,
  322.     59,     0,    11,     0,    61,   144,   128,   129,     0,     0,
  323.      0,     0,   142,   132,   141,     0,   101,   122,   147,    88,
  324.      0,    86,   148,     5,     3,     1,    15,     0,    12,    14,
  325.      0,     0,     0,     0,     0,     0,     0,     0,     0,    59,
  326.    108,     0,     0,     0,     0,     0,     0,     0,    92,   130,
  327.    131,    29,     0,    49,     0,     0,    59,     0,     0,     0,
  328.     53,    54,    46,    74,    59,     0,    27,     0,    36,     0,
  329.      0,   151,    59,     0,     0,    86,     0,     7,    32,     9,
  330.     17,    16,     0,     0,    96,     0,     0,     0,     0,    89,
  331.    150,     0,     0,   123,     0,   103,    99,   102,    97,    98,
  332.      0,   104,   105,   143,   154,    22,   139,   140,   136,   137,
  333.    138,   135,     0,     0,    74,     0,     0,     0,    74,    42,
  334.     43,     0,     0,    75,   149,    30,    28,   151,    80,   143,
  335.      0,     0,   114,    63,     0,    78,   120,   132,    52,     0,
  336.     34,    25,   152,    33,   127,   146,     0,    62,   124,   125,
  337.     24,    90,     0,    91,    87,    20,     0,    95,    93,     0,
  338.      0,     0,     0,     0,   145,     0,    47,    48,    26,    61,
  339.    115,     0,     0,     0,     0,     0,    81,     0,     0,     0,
  340.      0,     0,     0,     0,   121,   109,    35,    71,    69,     0,
  341.      0,    94,   106,    59,    50,     0,    59,     0,     0,     0,
  342.    113,    63,    65,    64,    66,    45,    82,    83,    79,   118,
  343.    116,   117,   111,   112,     0,     0,    59,    72,     0,     0,
  344.      0,     0,     0,     0,     0,    74,     0,     0,   110,    19,
  345.     73,    70,    55,    51,    37,     0,    59,    74,     0,    44,
  346.    119,    59,    59,     0,     0,    59,     0,    38,    39,    59,
  347.      0,    56,     0,    41,    40,     0,     0,     0
  348. };
  349.  
  350. static const short yydefgoto[] = {   296,
  351.     25,    26,    38,    42,   123,    27,    44,    67,    28,    29,
  352.     56,    30,   106,    39,   107,   162,   155,   108,   109,     2,
  353.      3,   125,   216,   230,   231,   163,   174,   175,   114,   115,
  354.     81,   153,   225,   256,    32,    45,    33,   111,   112,   134,
  355.    182,   113,   133
  356. };
  357.  
  358. static const short yypact[] = {    21,
  359. -32768,    37,  1020,-32768,-32768,   -32,     1,-32768,-32768,    17,
  360.     17,-32768,    11,    11,    11,    31,    45,  1757,  1757,-32768,
  361.   1738,  1757,  1112,    21,   540,-32768,    13,    40,-32768,-32768,
  362.    816,   142,    55,   612,  1092,  1112,-32768,    13,-32768,    37,
  363.     21,    13,-32768,    51,    59,-32768,-32768,-32768,  1092,  1092,
  364.   1757,  1625,    27,    -7,    27,    97,-32768,    27,-32768,-32768,
  365.      4,  1225,-32768,-32768,-32768,-32768,-32768,   706,-32768,-32768,
  366.   1625,  1625,   100,  1625,  1625,  1625,  1625,  1625,    76,    21,
  367.    300,  1625,  1757,  1757,  1757,  1757,  1757,  1757,-32768,-32768,
  368. -32768,-32768,    52,-32768,   109,    62,    21,    64,    17,    17,
  369. -32768,-32768,-32768,  1625,    21,   659,-32768,   763,-32768,   920,
  370.    612,    65,    21,    67,     7,  1324,    25,-32768,-32768,-32768,
  371. -32768,-32768,    70,  1757,-32768,    67,    67,  1225,    84,  1625,
  372. -32768,   101,  1159,-32768,   659,  1811,  1796,-32768,  1465,  1371,
  373.   1277,  1811,  1811,    11,-32768,  1324,   -10,   -10,    27,    27,
  374.     27,    27,  1625,  1625,  1625,    87,  1625,   863,  1672,-32768,
  375. -32768,    17,    17,  1324,-32768,-32768,-32768,    65,-32768,    11,
  376.   1738,  1112,-32768,     9,     0,  1512,   142,    83,-32768,   659,
  377. -32768,-32768,-32768,-32768,-32768,-32768,     8,   142,-32768,-32768,
  378. -32768,  1324,   134,-32768,  1324,-32768,  1625,-32768,  1324,  1225,
  379.     17,  1112,  1225,   122,   -16,    65,-32768,-32768,-32768,    59,
  380. -32768,     4,  1625,  1625,  1625,    17,  1691,  1178,  1691,  1691,
  381.    140,  1691,  1691,  1691,   939,-32768,-32768,-32768,-32768,    67,
  382.     23,-32768,  1324,    21,-32768,    26,    21,    94,   144,  1045,
  383. -32768,     9,  1324,  1324,  1324,-32768,  1512,-32768,  1512,   782,
  384.   1858,-32768,  1606,  1559,  1418,  1691,    21,-32768,    44,   863,
  385.     17,   863,  1625,    67,   973,  1625,    17,  1691,  1512,-32768,
  386. -32768,-32768,   131,-32768,-32768,  1225,    21,  1625,    67,-32768,
  387.   1512,    21,    21,   863,    67,    21,   863,-32768,-32768,    21,
  388.    863,-32768,   863,-32768,-32768,   163,   166,-32768
  389. };
  390.  
  391. static const short yypgoto[] = {-32768,
  392. -32768,   145,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   201,
  393. -32768,    78,   -54,    12,   225,-32768,-32768,-32768,-32768,   363,
  394.    104,   -39,   -70,-32768,-32768,  -152,-32768,-32768,    60,   -19,
  395.     -3,-32768,   -83,-32768,   146,  -126,    74,   178,  -100,   319,
  396.     10,   329,   -29
  397. };
  398.  
  399.  
  400. #define    YYLAST        1911
  401.  
  402.  
  403. static const short yytable[] = {    31,
  404.    217,    82,   201,    61,   130,   168,   206,   130,   228,   -77,
  405.    181,   229,   -77,   135,     7,   239,   117,   198,   213,    62,
  406.     35,    31,    43,   258,   176,   130,   130,    90,    91,     1,
  407.    110,   116,   116,     1,   196,    85,    86,    87,    36,    70,
  408.     88,   -77,   -77,   210,   271,   116,   116,   272,   128,     4,
  409.    214,   215,     1,   121,   122,    36,   180,   131,   -77,    80,
  410.    -85,   -67,    22,    80,   110,    89,    80,   136,   137,    24,
  411.    139,   140,   141,   142,   143,    37,   -68,    88,   146,   227,
  412.    186,   261,    80,    49,    80,    80,    46,    47,    48,    90,
  413.     91,    54,    54,   226,    54,    54,    24,    50,    37,   124,
  414.    164,   129,   110,   138,   154,    69,   144,   110,   126,   127,
  415.    160,   161,   156,   279,   157,   118,   159,    90,    91,   120,
  416.    131,   179,   187,    37,    54,   285,   192,    63,    66,   195,
  417.    191,   110,   193,   247,   249,   250,   251,   232,   253,   254,
  418.    255,   202,   238,   252,   119,   218,   263,   264,   282,   199,
  419.    200,   164,   212,   203,   110,   164,    54,    54,    54,    54,
  420.     54,    54,   297,    53,    55,   298,    58,    59,    62,    65,
  421.    241,   267,   269,   207,   208,     0,   110,   209,     0,     0,
  422.     34,   178,   236,   145,   281,    83,    84,    85,    86,    87,
  423.      0,     0,    88,   233,     0,     0,    58,    54,   116,     0,
  424.    158,   259,    34,     0,    68,    34,     0,     0,   165,   243,
  425.    244,   245,   235,     0,     0,    34,   184,    46,     0,    34,
  426.      0,    57,     0,     0,     0,     0,     0,   246,   147,   148,
  427.    149,   150,   151,   152,     0,     0,   265,     0,     0,     0,
  428.      0,     0,     0,    46,    54,     0,     0,     0,     0,   178,
  429.      0,     0,     0,   177,     0,     0,   110,     0,   110,   276,
  430.      0,     0,   164,     0,     0,     0,     0,     0,     0,   188,
  431.      0,     0,   274,     0,   164,     0,     0,     0,   280,     0,
  432.    110,     0,     0,   110,     0,     0,     0,   110,     0,   110,
  433.    178,   178,   178,   178,     0,   178,   178,   178,   178,     0,
  434.      0,     0,     0,     7,     0,     0,     8,     9,   173,     0,
  435.      0,     0,     0,     0,     0,     0,    58,     0,     0,     0,
  436.    178,   177,   178,   178,   178,     0,   178,   178,   178,   178,
  437.    167,     0,     0,     0,    14,    15,     0,   260,    41,    41,
  438.    262,   178,   178,    18,    19,     0,    20,     0,    21,     0,
  439.      0,    22,    23,     0,   178,     0,    41,     0,     0,   167,
  440.    270,     0,   177,   177,   177,   177,     0,   177,   177,   177,
  441.    177,   211,    40,    40,     0,     0,   173,     0,     0,   132,
  442.    284,     0,   204,     0,     0,   287,   288,     0,     0,   291,
  443.     40,     0,   177,   293,   177,   177,   177,     0,   177,   177,
  444.    177,   177,     0,     0,   167,     0,     0,     0,     0,     0,
  445.      0,     0,     0,   177,   177,     0,     0,   173,   173,   173,
  446.    173,     0,   173,   173,   173,   173,   177,    41,    41,     0,
  447.      0,     0,   185,     0,     0,     0,     0,     0,    41,     0,
  448.    183,     0,     0,     0,   189,   190,     0,   173,     0,   173,
  449.    173,   173,     0,   173,   173,   173,   173,     0,     0,     0,
  450.      0,    40,    40,     0,     0,     0,     0,     0,   173,   173,
  451.      0,     0,    40,     0,     0,     0,     0,     0,     0,     0,
  452.      0,   173,     0,     0,   273,     0,   275,     0,     0,     0,
  453.     41,    41,     0,     0,     0,     0,   183,     0,     0,     0,
  454.      0,     0,     0,     0,     0,     0,     0,     0,   289,     0,
  455.      0,   292,     0,     0,     0,   294,     0,   295,   234,     0,
  456.      0,   237,     0,     0,    40,    40,     0,     0,     0,    41,
  457.    242,     0,     0,     0,   240,     0,     0,     0,     0,   -59,
  458.     64,     0,     6,     7,    41,     0,     8,     9,   257,     0,
  459.      0,     0,     1,     0,    10,    11,     0,     0,     0,     0,
  460.      0,     0,     0,    40,     0,     0,     0,     0,   266,    12,
  461.     13,     0,     0,     0,    14,    15,    16,    17,    40,     0,
  462.      0,     0,   277,    18,    19,     0,    20,     0,    21,    41,
  463.      0,    22,    23,   278,   283,    41,    24,   286,     0,     0,
  464.      0,     0,     0,   290,     0,     0,     0,     0,     0,     0,
  465.      0,     0,    92,     0,     6,     7,     0,     0,     8,     9,
  466.      0,     0,     0,    40,     0,     0,     0,     0,    93,    40,
  467.     94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
  468.    104,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  469.      0,     0,     0,     0,     0,    18,    19,     0,    20,   166,
  470.     21,     6,     7,    22,    23,     8,     9,     0,    24,   105,
  471.     37,     0,     0,     0,     0,    93,     0,    94,    95,    96,
  472.     97,    98,    99,   100,   101,   102,   103,   104,     0,    13,
  473.      0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
  474.      0,     0,    18,    19,     0,    20,    92,    21,     6,     7,
  475.     22,    23,     8,     9,     0,    24,   105,    37,     0,     0,
  476.      0,     0,    93,     0,    94,    95,    96,    97,    98,    99,
  477.    100,   101,   102,   103,   104,     0,    13,     0,     0,     0,
  478.     14,    15,    16,    17,     0,     0,     0,     0,     0,    18,
  479.     19,     0,    20,     0,    21,     0,     0,    22,    23,     0,
  480.      0,     0,    24,   169,    37,     6,     7,     0,     0,     8,
  481.      9,     0,   -76,     0,     0,   -76,     0,     0,     0,     0,
  482.      0,     0,     0,     0,     0,     7,     0,     0,     8,     9,
  483. -32768,     0,     0,   170,     0,     0,     0,    14,    15,    16,
  484.     17,     0,     0,     0,   -76,   -76,    18,    19,     0,    20,
  485.      0,   171,     0,     0,    22,   172,    14,    15,     6,     7,
  486.      0,   -76,     8,     9,    71,    18,    19,    72,    20,     0,
  487.    171,     0,     0,    22,    52,     0,     0,     0,     0,     0,
  488.      0,     0,     0,     0,     0,     0,    13,    73,    74,    75,
  489.     14,    15,    16,    17,    76,     0,    77,    78,    79,    18,
  490.     19,     0,    20,     0,    21,     6,     7,    22,    23,     8,
  491.      9,     0,     0,     0,     0,    80,     0,     0,     0,    93,
  492.      0,    94,    95,    96,    97,    98,    99,   100,   101,   102,
  493.    103,   104,     0,    13,     0,     0,     0,    14,    15,    16,
  494.     17,     0,     0,     0,     0,     0,    18,    19,     0,    20,
  495.      0,    21,     0,     0,    22,    23,     0,     0,     0,    24,
  496.      0,    37,     6,     7,     0,     0,     8,     9,    71,     0,
  497.      0,    72,     1,     0,     0,     0,     0,     0,     0,     0,
  498.      0,     0,     7,     0,     0,     8,     9,     0,     0,     0,
  499.     13,    73,    74,    75,    14,    15,    16,    17,    76,     0,
  500.     77,    78,    79,    18,    19,     0,    20,     0,    21,     0,
  501.      0,    22,    23,    14,    15,     6,     7,     0,    37,     8,
  502.      9,    71,    18,    19,    72,    20,     0,   171,     0,     0,
  503.     22,    52,     0,     0,     0,     0,     0,     0,     0,     0,
  504.      0,     0,     0,    13,    73,    74,    75,    14,    15,    16,
  505.     17,    76,     0,    77,    78,    79,    18,    19,     0,    20,
  506.      5,    21,     6,     7,    22,    23,     8,     9,     0,     0,
  507.      0,    37,     0,     0,    10,    11,     0,     0,     0,     0,
  508.      0,     0,     0,     0,     0,     0,     0,     6,     7,    12,
  509.     13,     8,     9,     0,    14,    15,    16,    17,     0,     0,
  510.      0,     0,     0,    18,    19,     0,    20,     0,    21,     0,
  511.      0,    22,    23,     0,     0,    13,    24,     0,     0,    14,
  512.     15,    16,    17,     0,     0,     0,     0,     0,    18,    19,
  513.      0,    20,    60,    21,     6,     7,    22,    23,     8,     9,
  514.      0,     0,     0,    37,     0,     0,     0,     0,     0,     0,
  515.      0,     0,    60,     0,     6,     7,     0,     0,     8,     9,
  516.      0,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  517.      0,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  518.     21,     0,    13,    22,    23,   -84,    14,    15,    16,    17,
  519.      0,     0,     0,     0,     0,    18,    19,     0,    20,   194,
  520.     21,     6,     7,    22,    23,     8,     9,     0,     0,     0,
  521.      0,     0,     0,     0,     0,     0,     0,     0,   248,     0,
  522.      6,     7,     0,     0,     8,     9,     0,     0,     0,    13,
  523.      0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
  524.      0,     0,    18,    19,     0,    20,     0,    21,   170,     0,
  525.     22,    23,    14,    15,    16,    17,     0,     0,     0,     0,
  526.      0,    18,    19,     0,    20,     0,   171,     6,     7,    22,
  527.     52,     8,     9,    71,     0,     0,    72,     0,     0,     0,
  528.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  529.      0,     0,     0,     0,     0,    13,    73,    74,    75,    14,
  530.     15,    16,    17,    76,     0,    77,    78,    79,    18,    19,
  531.      0,    20,     0,    21,     0,     0,    22,    23,   131,     6,
  532.      7,     0,     0,     8,     9,    71,     0,     0,    72,     0,
  533.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  534.      0,     0,     0,     0,     0,     0,     0,    13,    73,    74,
  535.     75,    14,    15,    16,    17,    76,   197,    77,    78,    79,
  536.     18,    19,     0,    20,     0,    21,     6,     7,    22,    23,
  537.      8,     9,    71,     0,     0,    72,     0,     0,     0,     0,
  538.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  539.      0,     0,     0,     0,    13,    73,    74,    75,    14,    15,
  540.     16,    17,    76,     0,    77,    78,    79,    18,    19,     0,
  541.     20,     0,    21,     6,     7,    22,    23,     8,     9,    71,
  542.      0,     0,    72,     0,     0,     0,     0,     0,     0,     0,
  543.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  544.      0,    13,    73,    74,     0,    14,    15,    16,    17,     0,
  545.      0,    77,    78,    79,    18,    19,     0,    20,     0,    21,
  546.      6,     7,    22,    23,     8,     9,   219,     0,     0,   220,
  547.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  548.      0,     0,     0,     0,     0,     0,     0,     0,   170,   221,
  549.    222,   223,    14,    15,    16,    17,   224,   268,     0,     0,
  550.      0,    18,    19,     0,    20,     0,   171,     6,     7,    22,
  551.     52,     8,     9,    71,     0,     0,    72,     0,     0,     0,
  552.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  553.      0,     0,     0,     0,     0,    13,    73,     0,     0,    14,
  554.     15,    16,    17,     0,     0,    77,    78,    79,    18,    19,
  555.      0,    20,     0,    21,     6,     7,    22,    23,     8,     9,
  556.    219,     0,     0,   220,     0,     0,     0,     0,     0,     0,
  557.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  558.      0,     0,   170,   221,   222,   223,    14,    15,    16,    17,
  559.    224,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  560.    171,     6,     7,    22,    52,     8,     9,   219,     0,     0,
  561.    220,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  562.      0,     0,     0,     0,     0,     0,     0,     0,     0,   170,
  563.    221,   222,     0,    14,    15,    16,    17,     0,     0,     0,
  564.      0,     0,    18,    19,     0,    20,     0,   171,     6,     7,
  565.     22,    52,     8,     9,   219,     0,     0,   220,     0,     0,
  566.      0,     0,     0,     0,     0,     0,     0,     6,     7,     0,
  567.      0,     8,     9,     0,     0,     0,   170,   221,     0,     0,
  568.     14,    15,    16,    17,     0,     0,     0,     0,     0,    18,
  569.     19,     0,    20,     0,   171,    13,     0,    22,    52,    14,
  570.     15,    16,    17,     0,     0,     0,     0,     0,    18,    19,
  571.      0,    20,     0,    21,     6,   205,    22,    23,     8,     9,
  572.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  573.      0,     0,     0,     6,     7,     0,     0,     8,     9,     0,
  574.      0,     0,    13,     0,     0,     0,    14,    15,    16,    17,
  575.      0,     0,     0,     0,     0,    18,    19,     0,    20,     0,
  576.     21,   170,     0,    22,    23,    14,    15,    16,    17,     0,
  577.      0,     0,     0,     0,    18,    19,     0,    20,     0,   171,
  578.      6,     7,    22,    52,     8,     9,     0,     0,     0,     0,
  579.      0,     0,     0,     0,     0,     0,     0,     0,     0,     6,
  580.      7,     0,     0,     8,     9,     0,     0,     0,     0,     0,
  581.      0,     0,    14,    15,    16,    17,     0,     0,     0,     0,
  582.      0,    18,    19,     0,    20,     0,    51,     0,     0,    22,
  583.     52,    14,    15,    16,    17,     0,     0,     0,     0,     7,
  584.     18,    19,     8,     9,    71,    51,     0,-32768,    22,    52,
  585.      0,     0,     0,     0,     7,     0,     0,     8,     9,-32768,
  586.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  587.     14,    15,     0,     0,     0,     0,    77,    78,    79,    18,
  588.     19,     0,    20,     0,    21,    14,    15,    22,    23,     0,
  589.      0,-32768,-32768,-32768,    18,    19,     0,    20,     0,    21,
  590.      0,     7,    22,    23,     8,     9,   219,     0,     0,-32768,
  591.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  592.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  593.      0,     0,    14,    15,     0,     0,     0,     0,     0,     0,
  594.      0,    18,    19,     0,    20,     0,   171,     0,     0,    22,
  595.     52
  596. };
  597.  
  598. static const short yycheck[] = {     3,
  599.      1,    31,   155,    23,     1,   106,   159,     1,     1,    10,
  600.    111,     4,    13,    68,     4,    32,    36,   144,    10,    23,
  601.     53,    25,    11,     1,   108,     1,     1,    35,    36,    13,
  602.     34,    35,    36,    13,   135,    46,    47,    48,    55,    28,
  603.     51,    42,    43,   170,     1,    49,    50,     4,    52,    13,
  604.     42,    43,    13,     3,     4,    55,   111,    54,    59,    60,
  605.     54,    54,    52,    60,    68,    11,    60,    71,    72,    57,
  606.     74,    75,    76,    77,    78,    59,    54,    51,    82,   180,
  607.     56,    56,    60,    53,    60,    60,    13,    14,    15,    35,
  608.     36,    18,    19,    11,    21,    22,    57,    53,    59,    41,
  609.    104,     5,   106,     4,    53,    28,    31,   111,    49,    50,
  610.     99,   100,     4,   266,    53,    38,    53,    35,    36,    42,
  611.     54,   110,    53,    59,    51,   278,   130,    24,    25,   133,
  612.     47,   135,    32,   217,   218,   219,   220,     4,   222,   223,
  613.    224,    55,    21,     4,    41,   175,    53,     4,    18,   153,
  614.    154,   155,   172,   157,   158,   159,    83,    84,    85,    86,
  615.     87,    88,     0,    18,    19,     0,    21,    22,   172,    25,
  616.    210,   242,   256,   162,   163,    -1,   180,   168,    -1,    -1,
  617.      3,   108,   202,    80,   268,    44,    45,    46,    47,    48,
  618.     -1,    -1,    51,   197,    -1,    -1,    51,   124,   202,    -1,
  619.     97,   231,    25,    -1,    27,    28,    -1,    -1,   105,   213,
  620.    214,   215,   201,    -1,    -1,    38,   113,   144,    -1,    42,
  621.     -1,    21,    -1,    -1,    -1,    -1,    -1,   216,    83,    84,
  622.     85,    86,    87,    88,    -1,    -1,   240,    -1,    -1,    -1,
  623.     -1,    -1,    -1,   170,   171,    -1,    -1,    -1,    -1,   176,
  624.     -1,    -1,    -1,   108,    -1,    -1,   260,    -1,   262,   263,
  625.     -1,    -1,   266,    -1,    -1,    -1,    -1,    -1,    -1,   124,
  626.     -1,    -1,   261,    -1,   278,    -1,    -1,    -1,   267,    -1,
  627.    284,    -1,    -1,   287,    -1,    -1,    -1,   291,    -1,   293,
  628.    217,   218,   219,   220,    -1,   222,   223,   224,   225,    -1,
  629.     -1,    -1,    -1,     4,    -1,    -1,     7,     8,   108,    -1,
  630.     -1,    -1,    -1,    -1,    -1,    -1,   171,    -1,    -1,    -1,
  631.    247,   176,   249,   250,   251,    -1,   253,   254,   255,   256,
  632.    106,    -1,    -1,    -1,    35,    36,    -1,   234,    10,    11,
  633.    237,   268,   269,    44,    45,    -1,    47,    -1,    49,    -1,
  634.     -1,    52,    53,    -1,   281,    -1,    28,    -1,    -1,   135,
  635.    257,    -1,   217,   218,   219,   220,    -1,   222,   223,   224,
  636.    225,   171,    10,    11,    -1,    -1,   176,    -1,    -1,    61,
  637.    277,    -1,   158,    -1,    -1,   282,   283,    -1,    -1,   286,
  638.     28,    -1,   247,   290,   249,   250,   251,    -1,   253,   254,
  639.    255,   256,    -1,    -1,   180,    -1,    -1,    -1,    -1,    -1,
  640.     -1,    -1,    -1,   268,   269,    -1,    -1,   217,   218,   219,
  641.    220,    -1,   222,   223,   224,   225,   281,    99,   100,    -1,
  642.     -1,    -1,   114,    -1,    -1,    -1,    -1,    -1,   110,    -1,
  643.    112,    -1,    -1,    -1,   126,   127,    -1,   247,    -1,   249,
  644.    250,   251,    -1,   253,   254,   255,   256,    -1,    -1,    -1,
  645.     -1,    99,   100,    -1,    -1,    -1,    -1,    -1,   268,   269,
  646.     -1,    -1,   110,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  647.     -1,   281,    -1,    -1,   260,    -1,   262,    -1,    -1,    -1,
  648.    162,   163,    -1,    -1,    -1,    -1,   168,    -1,    -1,    -1,
  649.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   284,    -1,
  650.     -1,   287,    -1,    -1,    -1,   291,    -1,   293,   200,    -1,
  651.     -1,   203,    -1,    -1,   162,   163,    -1,    -1,    -1,   201,
  652.    212,    -1,    -1,    -1,   206,    -1,    -1,    -1,    -1,     0,
  653.      1,    -1,     3,     4,   216,    -1,     7,     8,   230,    -1,
  654.     -1,    -1,    13,    -1,    15,    16,    -1,    -1,    -1,    -1,
  655.     -1,    -1,    -1,   201,    -1,    -1,    -1,    -1,   240,    30,
  656.     31,    -1,    -1,    -1,    35,    36,    37,    38,   216,    -1,
  657.     -1,    -1,   264,    44,    45,    -1,    47,    -1,    49,   261,
  658.     -1,    52,    53,   265,   276,   267,    57,   279,    -1,    -1,
  659.     -1,    -1,    -1,   285,    -1,    -1,    -1,    -1,    -1,    -1,
  660.     -1,    -1,     1,    -1,     3,     4,    -1,    -1,     7,     8,
  661.     -1,    -1,    -1,   261,    -1,    -1,    -1,    -1,    17,   267,
  662.     19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
  663.     29,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  664.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,     1,
  665.     49,     3,     4,    52,    53,     7,     8,    -1,    57,    58,
  666.     59,    -1,    -1,    -1,    -1,    17,    -1,    19,    20,    21,
  667.     22,    23,    24,    25,    26,    27,    28,    29,    -1,    31,
  668.     -1,    -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  669.     -1,    -1,    44,    45,    -1,    47,     1,    49,     3,     4,
  670.     52,    53,     7,     8,    -1,    57,    58,    59,    -1,    -1,
  671.     -1,    -1,    17,    -1,    19,    20,    21,    22,    23,    24,
  672.     25,    26,    27,    28,    29,    -1,    31,    -1,    -1,    -1,
  673.     35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,
  674.     45,    -1,    47,    -1,    49,    -1,    -1,    52,    53,    -1,
  675.     -1,    -1,    57,     1,    59,     3,     4,    -1,    -1,     7,
  676.      8,    -1,    10,    -1,    -1,    13,    -1,    -1,    -1,    -1,
  677.     -1,    -1,    -1,    -1,    -1,     4,    -1,    -1,     7,     8,
  678.      9,    -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,
  679.     38,    -1,    -1,    -1,    42,    43,    44,    45,    -1,    47,
  680.     -1,    49,    -1,    -1,    52,    53,    35,    36,     3,     4,
  681.     -1,    59,     7,     8,     9,    44,    45,    12,    47,    -1,
  682.     49,    -1,    -1,    52,    53,    -1,    -1,    -1,    -1,    -1,
  683.     -1,    -1,    -1,    -1,    -1,    -1,    31,    32,    33,    34,
  684.     35,    36,    37,    38,    39,    -1,    41,    42,    43,    44,
  685.     45,    -1,    47,    -1,    49,     3,     4,    52,    53,     7,
  686.      8,    -1,    -1,    -1,    -1,    60,    -1,    -1,    -1,    17,
  687.     -1,    19,    20,    21,    22,    23,    24,    25,    26,    27,
  688.     28,    29,    -1,    31,    -1,    -1,    -1,    35,    36,    37,
  689.     38,    -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,
  690.     -1,    49,    -1,    -1,    52,    53,    -1,    -1,    -1,    57,
  691.     -1,    59,     3,     4,    -1,    -1,     7,     8,     9,    -1,
  692.     -1,    12,    13,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  693.     -1,    -1,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,
  694.     31,    32,    33,    34,    35,    36,    37,    38,    39,    -1,
  695.     41,    42,    43,    44,    45,    -1,    47,    -1,    49,    -1,
  696.     -1,    52,    53,    35,    36,     3,     4,    -1,    59,     7,
  697.      8,     9,    44,    45,    12,    47,    -1,    49,    -1,    -1,
  698.     52,    53,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  699.     -1,    -1,    -1,    31,    32,    33,    34,    35,    36,    37,
  700.     38,    39,    -1,    41,    42,    43,    44,    45,    -1,    47,
  701.      1,    49,     3,     4,    52,    53,     7,     8,    -1,    -1,
  702.     -1,    59,    -1,    -1,    15,    16,    -1,    -1,    -1,    -1,
  703.     -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,    30,
  704.     31,     7,     8,    -1,    35,    36,    37,    38,    -1,    -1,
  705.     -1,    -1,    -1,    44,    45,    -1,    47,    -1,    49,    -1,
  706.     -1,    52,    53,    -1,    -1,    31,    57,    -1,    -1,    35,
  707.     36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,    45,
  708.     -1,    47,     1,    49,     3,     4,    52,    53,     7,     8,
  709.     -1,    -1,    -1,    59,    -1,    -1,    -1,    -1,    -1,    -1,
  710.     -1,    -1,     1,    -1,     3,     4,    -1,    -1,     7,     8,
  711.     -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  712.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  713.     49,    -1,    31,    52,    53,    54,    35,    36,    37,    38,
  714.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,     1,
  715.     49,     3,     4,    52,    53,     7,     8,    -1,    -1,    -1,
  716.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,
  717.      3,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,    31,
  718.     -1,    -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  719.     -1,    -1,    44,    45,    -1,    47,    -1,    49,    31,    -1,
  720.     52,    53,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
  721.     -1,    44,    45,    -1,    47,    -1,    49,     3,     4,    52,
  722.     53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,
  723.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  724.     -1,    -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,
  725.     36,    37,    38,    39,    -1,    41,    42,    43,    44,    45,
  726.     -1,    47,    -1,    49,    -1,    -1,    52,    53,    54,     3,
  727.      4,    -1,    -1,     7,     8,     9,    -1,    -1,    12,    -1,
  728.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  729.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    32,    33,
  730.     34,    35,    36,    37,    38,    39,    40,    41,    42,    43,
  731.     44,    45,    -1,    47,    -1,    49,     3,     4,    52,    53,
  732.      7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,    -1,
  733.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  734.     -1,    -1,    -1,    -1,    31,    32,    33,    34,    35,    36,
  735.     37,    38,    39,    -1,    41,    42,    43,    44,    45,    -1,
  736.     47,    -1,    49,     3,     4,    52,    53,     7,     8,     9,
  737.     -1,    -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  738.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  739.     -1,    31,    32,    33,    -1,    35,    36,    37,    38,    -1,
  740.     -1,    41,    42,    43,    44,    45,    -1,    47,    -1,    49,
  741.      3,     4,    52,    53,     7,     8,     9,    -1,    -1,    12,
  742.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  743.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    32,
  744.     33,    34,    35,    36,    37,    38,    39,    40,    -1,    -1,
  745.     -1,    44,    45,    -1,    47,    -1,    49,     3,     4,    52,
  746.     53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,    -1,
  747.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  748.     -1,    -1,    -1,    -1,    -1,    31,    32,    -1,    -1,    35,
  749.     36,    37,    38,    -1,    -1,    41,    42,    43,    44,    45,
  750.     -1,    47,    -1,    49,     3,     4,    52,    53,     7,     8,
  751.      9,    -1,    -1,    12,    -1,    -1,    -1,    -1,    -1,    -1,
  752.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  753.     -1,    -1,    31,    32,    33,    34,    35,    36,    37,    38,
  754.     39,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  755.     49,     3,     4,    52,    53,     7,     8,     9,    -1,    -1,
  756.     12,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  757.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,
  758.     32,    33,    -1,    35,    36,    37,    38,    -1,    -1,    -1,
  759.     -1,    -1,    44,    45,    -1,    47,    -1,    49,     3,     4,
  760.     52,    53,     7,     8,     9,    -1,    -1,    12,    -1,    -1,
  761.     -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,     4,    -1,
  762.     -1,     7,     8,    -1,    -1,    -1,    31,    32,    -1,    -1,
  763.     35,    36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,
  764.     45,    -1,    47,    -1,    49,    31,    -1,    52,    53,    35,
  765.     36,    37,    38,    -1,    -1,    -1,    -1,    -1,    44,    45,
  766.     -1,    47,    -1,    49,     3,     4,    52,    53,     7,     8,
  767.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  768.     -1,    -1,    -1,     3,     4,    -1,    -1,     7,     8,    -1,
  769.     -1,    -1,    31,    -1,    -1,    -1,    35,    36,    37,    38,
  770.     -1,    -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,
  771.     49,    31,    -1,    52,    53,    35,    36,    37,    38,    -1,
  772.     -1,    -1,    -1,    -1,    44,    45,    -1,    47,    -1,    49,
  773.      3,     4,    52,    53,     7,     8,    -1,    -1,    -1,    -1,
  774.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     3,
  775.      4,    -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,
  776.     -1,    -1,    35,    36,    37,    38,    -1,    -1,    -1,    -1,
  777.     -1,    44,    45,    -1,    47,    -1,    49,    -1,    -1,    52,
  778.     53,    35,    36,    37,    38,    -1,    -1,    -1,    -1,     4,
  779.     44,    45,     7,     8,     9,    49,    -1,    12,    52,    53,
  780.     -1,    -1,    -1,    -1,     4,    -1,    -1,     7,     8,     9,
  781.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  782.     35,    36,    -1,    -1,    -1,    -1,    41,    42,    43,    44,
  783.     45,    -1,    47,    -1,    49,    35,    36,    52,    53,    -1,
  784.     -1,    41,    42,    43,    44,    45,    -1,    47,    -1,    49,
  785.     -1,     4,    52,    53,     7,     8,     9,    -1,    -1,    12,
  786.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  787.     -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
  788.     -1,    -1,    35,    36,    -1,    -1,    -1,    -1,    -1,    -1,
  789.     -1,    44,    45,    -1,    47,    -1,    49,    -1,    -1,    52,
  790.     53
  791. };
  792. #define YYPURE 1
  793.  
  794. /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
  795. #line 3 "bison.simple"
  796.  
  797. /* Skeleton output parser for bison,
  798.    Copyright (C) 1984 Bob Corbett and Richard Stallman
  799.  
  800.    This program is free software; you can redistribute it and/or modify
  801.    it under the terms of the GNU General Public License as published by
  802.    the Free Software Foundation; either version 1, or (at your option)
  803.    any later version.
  804.  
  805.    This program is distributed in the hope that it will be useful,
  806.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  807.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  808.    GNU General Public License for more details.
  809.  
  810.    You should have received a copy of the GNU General Public License
  811.    along with this program; if not, write to the Free Software
  812.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  813.  
  814.  
  815. #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
  816. #include <alloca.h>
  817. #endif
  818.  
  819. /* This is the parser code that is written into each bison parser
  820.   when the %semantic_parser declaration is not specified in the grammar.
  821.   It was written by Richard Stallman by simplifying the hairy parser
  822.   used when %semantic_parser is specified.  */
  823.  
  824. /* Note: there must be only one dollar sign in this file.
  825.    It is replaced by the list of actions, each action
  826.    as one case of the switch.  */
  827.  
  828. #define yyerrok        (yyerrstatus = 0)
  829. #define yyclearin    (yychar = YYEMPTY)
  830. #define YYEMPTY        -2
  831. #define YYEOF        0
  832. #define YYFAIL        goto yyerrlab;
  833. /* - done above, THINK C objects to second time 
  834. #define YYACCEPT    return(0)
  835. #define YYABORT     return(1)
  836. #define YYERROR        goto yyerrlab
  837. */
  838. #define YYTERROR    1
  839. #define YYERRCODE    256
  840.  
  841. #ifndef YYIMPURE
  842. #define YYLEX        yylex()
  843. #endif
  844.  
  845. #ifndef YYPURE
  846. #define YYLEX        yylex(&yylval, &yylloc)
  847. #endif
  848.  
  849. /* If nonreentrant, generate the variables here */
  850.  
  851. #ifndef YYIMPURE
  852.  
  853. short    yychar;            /*  the lookahead symbol        */
  854. YYSTYPE    yylval;            /*  the semantic value of the        */
  855.                 /*  lookahead symbol            */
  856.  
  857. YYLTYPE yylloc;            /*  location data for the lookahead    */
  858.                 /*  symbol                */
  859.  
  860. short yynerrs;            /*  number of parse errors so far       */
  861. #endif  /* YYIMPURE */
  862.  
  863. #if YYDEBUG != 0
  864. short yydebug;            /*  nonzero means print parse trace    */
  865. /* Since this is uninitialized, it does not stop multiple parsers
  866.    from coexisting.  */
  867. #endif
  868.  
  869. /*  YYMAXDEPTH indicates the initial size of the parser's stacks    */
  870.  
  871. #ifndef    YYMAXDEPTH
  872. #define YYMAXDEPTH 200
  873. #endif
  874.  
  875. /*  YYMAXLIMIT is the maximum size the stacks can grow to
  876.     (effective only if the built-in stack extension method is used).  */
  877.  
  878. #ifndef YYMAXLIMIT
  879. #define YYMAXLIMIT 10000
  880. #endif
  881.  
  882.  
  883. #line 90 "bison.simple"
  884. short yyparse()
  885. {
  886.   register short yystate;
  887.   register short yyn;
  888.   register short *yyssp;
  889.   register YYSTYPE *yyvsp;
  890.   YYLTYPE *yylsp;
  891.   short yyerrstatus;    /*  number of tokens to shift before error messages enabled */
  892.   short yychar1;        /*  lookahead token as an internal (translated) token number */
  893.  
  894.   short    yyssa[YYMAXDEPTH];    /*  the state stack            */
  895.   YYSTYPE yyvsa[YYMAXDEPTH];    /*  the semantic value stack        */
  896.   YYLTYPE yylsa[YYMAXDEPTH];    /*  the location stack            */
  897.  
  898.   short *yyss = yyssa;        /*  refer to the stacks thru separate pointers */
  899.   YYSTYPE *yyvs = yyvsa;    /*  to allow yyoverflow to reallocate them elsewhere */
  900.   YYLTYPE *yyls = yylsa;
  901.  
  902.   short yymaxdepth = YYMAXDEPTH;
  903.  
  904. #ifndef YYPURE
  905.   short yychar;
  906.   YYSTYPE yylval;
  907.   YYLTYPE yylloc;
  908.   short yynerrs;
  909. #endif
  910.  
  911.   YYSTYPE yyval;        /*  the variable used to return        */
  912.                 /*  semantic values from the action    */
  913.                 /*  routines                */
  914.  
  915.   short yylen;
  916.  
  917. #if YYDEBUG != 0
  918.   if (yydebug)
  919.     fprintf(stderr, "Starting parse\n");
  920. #endif
  921.  
  922.   yystate = 0;
  923.   yyerrstatus = 0;
  924.   yynerrs = 0;
  925.   yychar = YYEMPTY;        /* Cause a token to be read.  */
  926.  
  927.   /* Initialize stack pointers.
  928.      Waste one element of value and location stack
  929.      so that they stay on the same level as the state stack.  */
  930.  
  931.   yyssp = yyss - 1;
  932.   yyvsp = yyvs;
  933.   yylsp = yyls;
  934.  
  935. /* Push a new state, which is found in  yystate  .  */
  936. /* In all cases, when you get here, the value and location stacks
  937.    have just been pushed. so pushing a state here evens the stacks.  */
  938. yynewstate:
  939.  
  940.   *++yyssp = yystate;
  941.  
  942.   if (yyssp >= yyss + yymaxdepth - 1)
  943.     {
  944.       /* Give user a chance to reallocate the stack */
  945.       /* Use copies of these so that the &'s don't force the real ones into memory. */
  946.       YYSTYPE *yyvs1 = yyvs;
  947.       YYLTYPE *yyls1 = yyls;
  948.       short *yyss1 = yyss;
  949.  
  950.       /* Get the current used size of the three stacks, in elements.  */
  951.       short size = (short)(yyssp - yyss) + 1;
  952.  
  953. #ifdef yyoverflow
  954.       /* Each stack pointer address is followed by the size of
  955.      the data in use in that stack, in bytes.  */
  956.       yyoverflow("parser stack overflow",
  957.          &yyss1, size * sizeof (*yyssp),
  958.          &yyvs1, size * sizeof (*yyvsp),
  959.          &yyls1, size * sizeof (*yylsp),
  960.          &yymaxdepth);
  961.  
  962.       yyss = yyss1; yyvs = yyvs1; yyls = yyls1;
  963. #else /* no yyoverflow */
  964.       /* Extend the stack our own way.  */
  965.       if (yymaxdepth >= YYMAXLIMIT)
  966.     yyerror("parser stack overflow");
  967.       yymaxdepth *= 2;
  968.       if (yymaxdepth > YYMAXLIMIT)
  969.     yymaxdepth = YYMAXLIMIT;
  970.       yyss = (short *) alloca (yymaxdepth * sizeof (*yyssp));
  971.       bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
  972.       yyvs = (YYSTYPE *) alloca (yymaxdepth * sizeof (*yyvsp));
  973.       bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
  974. #ifdef YYLSP_NEEDED
  975.       yyls = (YYLTYPE *) alloca (yymaxdepth * sizeof (*yylsp));
  976.       bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
  977. #endif
  978. #endif /* no yyoverflow */
  979.  
  980.       yyssp = yyss + size - 1;
  981.       yyvsp = yyvs + size - 1;
  982. #ifdef YYLSP_NEEDED
  983.       yylsp = yyls + size - 1;
  984. #endif
  985.  
  986. #if YYDEBUG != 0
  987.       if (yydebug)
  988.     fprintf(stderr, "Stack size increased to %d\n", yymaxdepth);
  989. #endif
  990.  
  991.       if (yyssp >= yyss + yymaxdepth - 1)
  992.     YYABORT;
  993.     }
  994.  
  995. #if YYDEBUG != 0
  996.   if (yydebug)
  997.     fprintf(stderr, "Entering state %d\n", yystate);
  998. #endif
  999.  
  1000. /* Do appropriate processing given the current state.  */
  1001. /* Read a lookahead token if we need one and don't already have one.  */
  1002. yyresume:
  1003.  
  1004.   /* First try to decide what to do without reference to lookahead token.  */
  1005.  
  1006.   yyn = yypact[yystate];
  1007.   if (yyn == YYFLAG)
  1008.     goto yydefault;
  1009.  
  1010.   /* Not known => get a lookahead token if don't already have one.  */
  1011.  
  1012.   /* yychar is either YYEMPTY or YYEOF
  1013.      or a valid token in external form.  */
  1014.  
  1015.   if (yychar == YYEMPTY)
  1016.     {
  1017. #if YYDEBUG != 0
  1018.       if (yydebug)
  1019.     fprintf(stderr, "Reading a token: ");
  1020. #endif
  1021.       yychar = YYLEX;
  1022.     }
  1023.  
  1024.   /* Convert token to internal form (in yychar1) for indexing tables with */
  1025.  
  1026.   if (yychar <= 0)        /* This means end of input. */
  1027.     {
  1028.       yychar1 = 0;
  1029.       yychar = YYEOF;        /* Don't call YYLEX any more */
  1030.  
  1031. #if YYDEBUG != 0
  1032.       if (yydebug)
  1033.     fprintf(stderr, "Now at end of input.\n");
  1034. #endif
  1035.     }
  1036.   else
  1037.     {
  1038.       yychar1 = YYTRANSLATE(yychar);
  1039.  
  1040. #if YYDEBUG != 0
  1041.       if (yydebug)
  1042.     fprintf(stderr, "Next token is %d (%s)\n", yychar, yytname[yychar1]);
  1043. #endif
  1044.     }
  1045.  
  1046.   yyn += yychar1;
  1047.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
  1048.     goto yydefault;
  1049.  
  1050.   yyn = yytable[yyn];
  1051.  
  1052.   /* yyn is what to do for this token type in this state.
  1053.      Negative => reduce, -yyn is rule number.
  1054.      Positive => shift, yyn is new state.
  1055.        New state is final state => don't bother to shift,
  1056.        just return success.
  1057.      0, or most negative number => error.  */
  1058.  
  1059.   if (yyn < 0)
  1060.     {
  1061.       if (yyn == YYFLAG)
  1062.     goto yyerrlab;
  1063.       yyn = -yyn;
  1064.       goto yyreduce;
  1065.     }
  1066.   else if (yyn == 0)
  1067.     goto yyerrlab;
  1068.  
  1069.   if (yyn == YYFINAL)
  1070.     YYACCEPT;
  1071.  
  1072.   /* Shift the lookahead token.  */
  1073.  
  1074. #if YYDEBUG != 0
  1075.   if (yydebug)
  1076.     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
  1077. #endif
  1078.  
  1079.   /* Discard the token being shifted unless it is eof.  */
  1080.   if (yychar != YYEOF)
  1081.     yychar = YYEMPTY;
  1082.  
  1083.   *++yyvsp = yylval;
  1084. #ifdef YYLSP_NEEDED
  1085.   *++yylsp = yylloc;
  1086. #endif
  1087.  
  1088.   /* count tokens shifted since error; after three, turn off error status.  */
  1089.   if (yyerrstatus) yyerrstatus--;
  1090.  
  1091.   yystate = yyn;
  1092.   goto yynewstate;
  1093.  
  1094. /* Do the default action for the current state.  */
  1095. yydefault:
  1096.  
  1097.   yyn = yydefact[yystate];
  1098.   if (yyn == 0)
  1099.     goto yyerrlab;
  1100.  
  1101. /* Do a reduction.  yyn is the number of a rule to reduce with.  */
  1102. yyreduce:
  1103.   yylen = yyr2[yyn];
  1104.   yyval = yyvsp[1-yylen]; /* implement default value of the action */
  1105.  
  1106. #if YYDEBUG != 0
  1107.   if (yydebug)
  1108.     {
  1109.       if (yylen == 1)
  1110.     fprintf (stderr, "Reducing 1 value via line %d, ",
  1111.          yyrline[yyn]);
  1112.       else
  1113.     fprintf (stderr, "Reducing %d values via line %d, ",
  1114.          yylen, yyrline[yyn]);
  1115.     }
  1116. #endif
  1117.  
  1118.  
  1119.   switch (yyn) {
  1120.  
  1121. case 1:
  1122. #line 137 "awk.y"
  1123. { expression_value = yyvsp[-1].nodeval; ;
  1124.     break;}
  1125. case 2:
  1126. #line 142 "awk.y"
  1127.             if (yyvsp[0].nodeval != NULL)
  1128.                 yyval.nodeval = yyvsp[0].nodeval;
  1129.             else
  1130.                 yyval.nodeval = NULL;
  1131.             yyerrok;
  1132.         ;
  1133.     break;}
  1134. case 3:
  1135. #line 151 "awk.y"
  1136. {
  1137.             if (yyvsp[0].nodeval == NULL)
  1138.                 yyval.nodeval = yyvsp[-1].nodeval;
  1139.             else if (yyvsp[-1].nodeval == NULL)
  1140.                 yyval.nodeval = yyvsp[0].nodeval;
  1141.             else {
  1142.                 if (yyvsp[-1].nodeval->type != Node_rule_list)
  1143.                     yyvsp[-1].nodeval = node(yyvsp[-1].nodeval, Node_rule_list,
  1144.                         (NODE*)NULL);
  1145.                 yyval.nodeval = append_right (yyvsp[-1].nodeval,
  1146.                    node(yyvsp[0].nodeval, Node_rule_list,(NODE *) NULL));
  1147.             }
  1148.             yyerrok;
  1149.         ;
  1150.     break;}
  1151. case 4:
  1152. #line 165 "awk.y"
  1153. { yyval.nodeval = NULL; ;
  1154.     break;}
  1155. case 5:
  1156. #line 166 "awk.y"
  1157. { yyval.nodeval = NULL; ;
  1158.     break;}
  1159. case 6:
  1160. #line 170 "awk.y"
  1161. { io_allowed = 0; ;
  1162.     break;}
  1163. case 7:
  1164. #line 172 "awk.y"
  1165. {
  1166.         if (begin_block) {
  1167.             if (begin_block->type != Node_rule_list)
  1168.                 begin_block = node(begin_block, Node_rule_list,
  1169.                     (NODE *)NULL);
  1170.             append_right (begin_block, node(
  1171.                 node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval),
  1172.                 Node_rule_list, (NODE *)NULL) );
  1173.         } else
  1174.             begin_block = node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval);
  1175.         yyval.nodeval = NULL;
  1176.         io_allowed = 1;
  1177.         yyerrok;
  1178.       ;
  1179.     break;}
  1180. case 8:
  1181. #line 186 "awk.y"
  1182. { io_allowed = 0; ;
  1183.     break;}
  1184. case 9:
  1185. #line 188 "awk.y"
  1186. {
  1187.         if (end_block) {
  1188.             if (end_block->type != Node_rule_list)
  1189.                 end_block = node(end_block, Node_rule_list,
  1190.                     (NODE *)NULL);
  1191.             append_right (end_block, node(
  1192.                 node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval),
  1193.                 Node_rule_list, (NODE *)NULL));
  1194.         } else
  1195.             end_block = node((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval);
  1196.         yyval.nodeval = NULL;
  1197.         io_allowed = 1;
  1198.         yyerrok;
  1199.       ;
  1200.     break;}
  1201. case 10:
  1202. #line 203 "awk.y"
  1203. {
  1204.         msg ("error near line %d: BEGIN blocks must have an action part", lineno);
  1205.         errcount++;
  1206.         yyerrok;
  1207.       ;
  1208.     break;}
  1209. case 11:
  1210. #line 209 "awk.y"
  1211. {
  1212.         msg ("error near line %d: END blocks must have an action part", lineno);
  1213.         errcount++;
  1214.         yyerrok;
  1215.       ;
  1216.     break;}
  1217. case 12:
  1218. #line 215 "awk.y"
  1219. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_rule_node, yyvsp[0].nodeval); yyerrok; ;
  1220.     break;}
  1221. case 13:
  1222. #line 217 "awk.y"
  1223. { yyval.nodeval = node ((NODE *)NULL, Node_rule_node, yyvsp[0].nodeval); yyerrok; ;
  1224.     break;}
  1225. case 14:
  1226. #line 219 "awk.y"
  1227. { if(yyvsp[-1].nodeval) yyval.nodeval = node (yyvsp[-1].nodeval, Node_rule_node, (NODE *)NULL); yyerrok; ;
  1228.     break;}
  1229. case 15:
  1230. #line 221 "awk.y"
  1231. {
  1232.             func_install(yyvsp[-1].nodeval, yyvsp[0].nodeval);
  1233.             yyval.nodeval = NULL;
  1234.             yyerrok;
  1235.         ;
  1236.     break;}
  1237. case 16:
  1238. #line 230 "awk.y"
  1239. { yyval.sval = yyvsp[0].sval; ;
  1240.     break;}
  1241. case 17:
  1242. #line 232 "awk.y"
  1243. { yyval.sval = yyvsp[0].sval; ;
  1244.     break;}
  1245. case 18:
  1246. #line 237 "awk.y"
  1247. {
  1248.             param_counter = 0;
  1249.         ;
  1250.     break;}
  1251. case 19:
  1252. #line 241 "awk.y"
  1253. {
  1254.             yyval.nodeval = append_right(make_param(yyvsp[-4].sval), yyvsp[-2].nodeval);
  1255.             can_return = 1;
  1256.         ;
  1257.     break;}
  1258. case 20:
  1259. #line 249 "awk.y"
  1260. {
  1261.         yyval.nodeval = yyvsp[-1].nodeval;
  1262.         can_return = 0;
  1263.       ;
  1264.     break;}
  1265. case 21:
  1266. #line 258 "awk.y"
  1267. { yyval.nodeval = yyvsp[0].nodeval; ;
  1268.     break;}
  1269. case 22:
  1270. #line 260 "awk.y"
  1271. { yyval.nodeval = mkrangenode ( node(yyvsp[-2].nodeval, Node_cond_pair, yyvsp[0].nodeval) ); ;
  1272.     break;}
  1273. case 23:
  1274. #line 269 "awk.y"
  1275. { ++want_regexp; ;
  1276.     break;}
  1277. case 24:
  1278. #line 271 "awk.y"
  1279. {
  1280.           want_regexp = 0;
  1281.           yyval.nodeval = node((NODE *)NULL,Node_regex,(NODE *)mk_re_parse(yyvsp[-1].sval, 0));
  1282.           yyval.nodeval -> re_case = 0;
  1283.           emalloc (yyval.nodeval -> re_text, char *, strlen(yyvsp[-1].sval)+1, "regexp");
  1284.           strcpy (yyval.nodeval -> re_text, yyvsp[-1].sval);
  1285.         ;
  1286.     break;}
  1287. case 25:
  1288. #line 282 "awk.y"
  1289. {
  1290.             /* empty actions are different from missing actions */
  1291.             yyval.nodeval = node ((NODE *) NULL, Node_illegal, (NODE *) NULL);
  1292.         ;
  1293.     break;}
  1294. case 26:
  1295. #line 287 "awk.y"
  1296. { yyval.nodeval = yyvsp[-2].nodeval ; ;
  1297.     break;}
  1298. case 27:
  1299. #line 292 "awk.y"
  1300. { yyval.nodeval = yyvsp[0].nodeval; ;
  1301.     break;}
  1302. case 28:
  1303. #line 294 "awk.y"
  1304. {
  1305.             if (yyvsp[-1].nodeval == NULL || yyvsp[-1].nodeval->type != Node_statement_list)
  1306.                 yyvsp[-1].nodeval = node(yyvsp[-1].nodeval, Node_statement_list,(NODE *)NULL);
  1307.                 yyval.nodeval = append_right(yyvsp[-1].nodeval,
  1308.                 node( yyvsp[0].nodeval, Node_statement_list, (NODE *)NULL));
  1309.                 yyerrok;
  1310.         ;
  1311.     break;}
  1312. case 29:
  1313. #line 302 "awk.y"
  1314. { yyval.nodeval = NULL; ;
  1315.     break;}
  1316. case 30:
  1317. #line 304 "awk.y"
  1318. { yyval.nodeval = NULL; ;
  1319.     break;}
  1320. case 31:
  1321. #line 309 "awk.y"
  1322. { yyval.nodetypeval = Node_illegal; ;
  1323.     break;}
  1324. case 32:
  1325. #line 311 "awk.y"
  1326. { yyval.nodetypeval = Node_illegal; ;
  1327.     break;}
  1328. case 33:
  1329. #line 317 "awk.y"
  1330. { yyval.nodeval = NULL; ;
  1331.     break;}
  1332. case 34:
  1333. #line 319 "awk.y"
  1334. { yyval.nodeval = NULL; ;
  1335.     break;}
  1336. case 35:
  1337. #line 321 "awk.y"
  1338. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1339.     break;}
  1340. case 36:
  1341. #line 323 "awk.y"
  1342. { yyval.nodeval = yyvsp[0].nodeval; ;
  1343.     break;}
  1344. case 37:
  1345. #line 325 "awk.y"
  1346. { yyval.nodeval = node (yyvsp[-3].nodeval, Node_K_while, yyvsp[0].nodeval); ;
  1347.     break;}
  1348. case 38:
  1349. #line 327 "awk.y"
  1350. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_K_do, yyvsp[-5].nodeval); ;
  1351.     break;}
  1352. case 39:
  1353. #line 329 "awk.y"
  1354. {
  1355.         yyval.nodeval = node (yyvsp[0].nodeval, Node_K_arrayfor, make_for_loop(variable(yyvsp[-5].sval),
  1356.             (NODE *)NULL, variable(yyvsp[-3].sval)));
  1357.       ;
  1358.     break;}
  1359. case 40:
  1360. #line 334 "awk.y"
  1361. {
  1362.         yyval.nodeval = node(yyvsp[0].nodeval, Node_K_for, (NODE *)make_for_loop(yyvsp[-7].nodeval, yyvsp[-5].nodeval, yyvsp[-3].nodeval));
  1363.       ;
  1364.     break;}
  1365. case 41:
  1366. #line 338 "awk.y"
  1367. {
  1368.         yyval.nodeval = node (yyvsp[0].nodeval, Node_K_for,
  1369.             (NODE *)make_for_loop(yyvsp[-6].nodeval, (NODE *)NULL, yyvsp[-3].nodeval));
  1370.       ;
  1371.     break;}
  1372. case 42:
  1373. #line 344 "awk.y"
  1374. { yyval.nodeval = node ((NODE *)NULL, Node_K_break, (NODE *)NULL); ;
  1375.     break;}
  1376. case 43:
  1377. #line 347 "awk.y"
  1378. { yyval.nodeval = node ((NODE *)NULL, Node_K_continue, (NODE *)NULL); ;
  1379.     break;}
  1380. case 44:
  1381. #line 349 "awk.y"
  1382. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-5].nodetypeval, yyvsp[-1].nodeval); ;
  1383.     break;}
  1384. case 45:
  1385. #line 351 "awk.y"
  1386. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-3].nodetypeval, yyvsp[-1].nodeval); ;
  1387.     break;}
  1388. case 46:
  1389. #line 353 "awk.y"
  1390. { if (! io_allowed) yyerror("next used in BEGIN or END action"); ;
  1391.     break;}
  1392. case 47:
  1393. #line 355 "awk.y"
  1394. { yyval.nodeval = node ((NODE *)NULL, Node_K_next, (NODE *)NULL); ;
  1395.     break;}
  1396. case 48:
  1397. #line 357 "awk.y"
  1398. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_exit, (NODE *)NULL); ;
  1399.     break;}
  1400. case 49:
  1401. #line 359 "awk.y"
  1402. { if (! can_return) yyerror("return used outside function context"); ;
  1403.     break;}
  1404. case 50:
  1405. #line 361 "awk.y"
  1406. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_return, (NODE *)NULL); ;
  1407.     break;}
  1408. case 51:
  1409. #line 363 "awk.y"
  1410. { yyval.nodeval = node (variable(yyvsp[-4].sval), Node_K_delete, yyvsp[-2].nodeval); ;
  1411.     break;}
  1412. case 52:
  1413. #line 365 "awk.y"
  1414. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1415.     break;}
  1416. case 53:
  1417. #line 370 "awk.y"
  1418. { yyval.nodetypeval = yyvsp[0].nodetypeval; ;
  1419.     break;}
  1420. case 54:
  1421. #line 372 "awk.y"
  1422. { yyval.nodetypeval = yyvsp[0].nodetypeval; ;
  1423.     break;}
  1424. case 55:
  1425. #line 377 "awk.y"
  1426. {
  1427.         yyval.nodeval = node(yyvsp[-3].nodeval, Node_K_if, 
  1428.             node(yyvsp[0].nodeval, Node_if_branches, (NODE *)NULL));
  1429.       ;
  1430.     break;}
  1431. case 56:
  1432. #line 383 "awk.y"
  1433. { yyval.nodeval = node (yyvsp[-6].nodeval, Node_K_if,
  1434.                 node (yyvsp[-3].nodeval, Node_if_branches, yyvsp[0].nodeval)); ;
  1435.     break;}
  1436. case 57:
  1437. #line 389 "awk.y"
  1438. { yyval.nodetypeval = 0; ; /* Node_illegal */
  1439.     break;}
  1440. case 58:
  1441. #line 391 "awk.y"
  1442. { yyval.nodetypeval = 0; ;
  1443.     break;}
  1444. case 59:
  1445. #line 396 "awk.y"
  1446. { yyval.nodetypeval = 0; ;
  1447.     break;}
  1448. case 60:
  1449. #line 398 "awk.y"
  1450. { yyval.nodetypeval = 0; ;
  1451.     break;}
  1452. case 61:
  1453. #line 403 "awk.y"
  1454. { yyval.nodeval = NULL; ;
  1455.     break;}
  1456. case 62:
  1457. #line 405 "awk.y"
  1458. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_input, (NODE *)NULL); ;
  1459.     break;}
  1460. case 63:
  1461. #line 410 "awk.y"
  1462. { yyval.nodeval = NULL; ;
  1463.     break;}
  1464. case 64:
  1465. #line 412 "awk.y"
  1466. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_output, (NODE *)NULL); ;
  1467.     break;}
  1468. case 65:
  1469. #line 414 "awk.y"
  1470. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_append, (NODE *)NULL); ;
  1471.     break;}
  1472. case 66:
  1473. #line 416 "awk.y"
  1474. { yyval.nodeval = node (yyvsp[0].nodeval, Node_redirect_pipe, (NODE *)NULL); ;
  1475.     break;}
  1476. case 67:
  1477. #line 421 "awk.y"
  1478. { yyval.nodeval = NULL; ;
  1479.     break;}
  1480. case 68:
  1481. #line 423 "awk.y"
  1482. { yyval.nodeval = yyvsp[0].nodeval; ;
  1483.     break;}
  1484. case 69:
  1485. #line 428 "awk.y"
  1486. { yyval.nodeval = make_param(yyvsp[0].sval); ;
  1487.     break;}
  1488. case 70:
  1489. #line 430 "awk.y"
  1490. { yyval.nodeval = append_right(yyvsp[-2].nodeval, make_param(yyvsp[0].sval)); yyerrok; ;
  1491.     break;}
  1492. case 71:
  1493. #line 432 "awk.y"
  1494. { yyval.nodeval = NULL; ;
  1495.     break;}
  1496. case 72:
  1497. #line 434 "awk.y"
  1498. { yyval.nodeval = NULL; ;
  1499.     break;}
  1500. case 73:
  1501. #line 436 "awk.y"
  1502. { yyval.nodeval = NULL; ;
  1503.     break;}
  1504. case 74:
  1505. #line 442 "awk.y"
  1506. { yyval.nodeval = NULL; ;
  1507.     break;}
  1508. case 75:
  1509. #line 444 "awk.y"
  1510. { yyval.nodeval = yyvsp[0].nodeval; ;
  1511.     break;}
  1512. case 76:
  1513. #line 449 "awk.y"
  1514. { yyval.nodeval = NULL; ;
  1515.     break;}
  1516. case 77:
  1517. #line 451 "awk.y"
  1518. { yyval.nodeval = yyvsp[0].nodeval; ;
  1519.     break;}
  1520. case 78:
  1521. #line 456 "awk.y"
  1522. { yyval.nodeval = node (yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL); ;
  1523.     break;}
  1524. case 79:
  1525. #line 458 "awk.y"
  1526. {
  1527.         yyval.nodeval = append_right(yyvsp[-2].nodeval,
  1528.             node( yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL));
  1529.         yyerrok;
  1530.       ;
  1531.     break;}
  1532. case 80:
  1533. #line 464 "awk.y"
  1534. { yyval.nodeval = NULL; ;
  1535.     break;}
  1536. case 81:
  1537. #line 466 "awk.y"
  1538. { yyval.nodeval = NULL; ;
  1539.     break;}
  1540. case 82:
  1541. #line 468 "awk.y"
  1542. { yyval.nodeval = NULL; ;
  1543.     break;}
  1544. case 83:
  1545. #line 470 "awk.y"
  1546. { yyval.nodeval = NULL; ;
  1547.     break;}
  1548. case 84:
  1549. #line 475 "awk.y"
  1550. { yyval.nodeval = NULL; ;
  1551.     break;}
  1552. case 85:
  1553. #line 477 "awk.y"
  1554. { yyval.nodeval = yyvsp[0].nodeval; ;
  1555.     break;}
  1556. case 86:
  1557. #line 482 "awk.y"
  1558. { yyval.nodeval = node (yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL); ;
  1559.     break;}
  1560. case 87:
  1561. #line 484 "awk.y"
  1562. {
  1563.             yyval.nodeval = append_right(yyvsp[-2].nodeval,
  1564.                 node( yyvsp[0].nodeval, Node_expression_list, (NODE *)NULL));
  1565.             yyerrok;
  1566.         ;
  1567.     break;}
  1568. case 88:
  1569. #line 490 "awk.y"
  1570. { yyval.nodeval = NULL; ;
  1571.     break;}
  1572. case 89:
  1573. #line 492 "awk.y"
  1574. { yyval.nodeval = NULL; ;
  1575.     break;}
  1576. case 90:
  1577. #line 494 "awk.y"
  1578. { yyval.nodeval = NULL; ;
  1579.     break;}
  1580. case 91:
  1581. #line 496 "awk.y"
  1582. { yyval.nodeval = NULL; ;
  1583.     break;}
  1584. case 92:
  1585. #line 501 "awk.y"
  1586. { want_assign = 0; ;
  1587.     break;}
  1588. case 93:
  1589. #line 503 "awk.y"
  1590. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-2].nodetypeval, yyvsp[0].nodeval); ;
  1591.     break;}
  1592. case 94:
  1593. #line 505 "awk.y"
  1594. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-3].nodeval); ;
  1595.     break;}
  1596. case 95:
  1597. #line 507 "awk.y"
  1598. {
  1599.           yyval.nodeval = node (yyvsp[0].nodeval, Node_K_getline,
  1600.              node (yyvsp[-3].nodeval, Node_redirect_pipein, (NODE *)NULL));
  1601.         ;
  1602.     break;}
  1603. case 96:
  1604. #line 512 "awk.y"
  1605. {
  1606.           /* "too painful to do right" */
  1607.           /*
  1608.           if (! io_allowed && $3 == NULL)
  1609.             yyerror("non-redirected getline illegal inside BEGIN or END action");
  1610.           */
  1611.           yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_getline, yyvsp[0].nodeval);
  1612.         ;
  1613.     break;}
  1614. case 97:
  1615. #line 521 "awk.y"
  1616. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_and, yyvsp[0].nodeval); ;
  1617.     break;}
  1618. case 98:
  1619. #line 523 "awk.y"
  1620. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_or, yyvsp[0].nodeval); ;
  1621.     break;}
  1622. case 99:
  1623. #line 525 "awk.y"
  1624. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1625.     break;}
  1626. case 100:
  1627. #line 527 "awk.y"
  1628. { yyval.nodeval = yyvsp[0].nodeval; ;
  1629.     break;}
  1630. case 101:
  1631. #line 529 "awk.y"
  1632. { yyval.nodeval = node((NODE *) NULL, Node_nomatch, yyvsp[0].nodeval); ;
  1633.     break;}
  1634. case 102:
  1635. #line 531 "awk.y"
  1636. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-2].nodeval); ;
  1637.     break;}
  1638. case 103:
  1639. #line 533 "awk.y"
  1640. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1641.     break;}
  1642. case 104:
  1643. #line 535 "awk.y"
  1644. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_less, yyvsp[0].nodeval); ;
  1645.     break;}
  1646. case 105:
  1647. #line 537 "awk.y"
  1648. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_greater, yyvsp[0].nodeval); ;
  1649.     break;}
  1650. case 106:
  1651. #line 539 "awk.y"
  1652. { yyval.nodeval = node(yyvsp[-4].nodeval, Node_cond_exp, node(yyvsp[-2].nodeval, Node_if_branches, yyvsp[0].nodeval));;
  1653.     break;}
  1654. case 107:
  1655. #line 541 "awk.y"
  1656. { yyval.nodeval = yyvsp[0].nodeval; ;
  1657.     break;}
  1658. case 108:
  1659. #line 543 "awk.y"
  1660. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_concat, yyvsp[0].nodeval); ;
  1661.     break;}
  1662. case 109:
  1663. #line 548 "awk.y"
  1664. { want_assign = 0; ;
  1665.     break;}
  1666. case 110:
  1667. #line 550 "awk.y"
  1668. { yyval.nodeval = node (yyvsp[-3].nodeval, yyvsp[-2].nodetypeval, yyvsp[0].nodeval); ;
  1669.     break;}
  1670. case 111:
  1671. #line 552 "awk.y"
  1672. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_and, yyvsp[0].nodeval); ;
  1673.     break;}
  1674. case 112:
  1675. #line 554 "awk.y"
  1676. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_or, yyvsp[0].nodeval); ;
  1677.     break;}
  1678. case 113:
  1679. #line 556 "awk.y"
  1680. {
  1681.           /* "too painful to do right" */
  1682.           /*
  1683.           if (! io_allowed && $3 == NULL)
  1684.             yyerror("non-redirected getline illegal inside BEGIN or END action");
  1685.           */
  1686.           yyval.nodeval = node (yyvsp[-1].nodeval, Node_K_getline, yyvsp[0].nodeval);
  1687.         ;
  1688.     break;}
  1689. case 114:
  1690. #line 565 "awk.y"
  1691. { yyval.nodeval = yyvsp[0].nodeval; ;
  1692.     break;}
  1693. case 115:
  1694. #line 567 "awk.y"
  1695. { yyval.nodeval = node((NODE *) NULL, Node_nomatch, yyvsp[0].nodeval); ;
  1696.     break;}
  1697. case 116:
  1698. #line 569 "awk.y"
  1699. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1700.     break;}
  1701. case 117:
  1702. #line 571 "awk.y"
  1703. { yyval.nodeval = node (variable(yyvsp[0].sval), Node_in_array, yyvsp[-2].nodeval); ;
  1704.     break;}
  1705. case 118:
  1706. #line 573 "awk.y"
  1707. { yyval.nodeval = node (yyvsp[-2].nodeval, yyvsp[-1].nodetypeval, yyvsp[0].nodeval); ;
  1708.     break;}
  1709. case 119:
  1710. #line 575 "awk.y"
  1711. { yyval.nodeval = node(yyvsp[-4].nodeval, Node_cond_exp, node(yyvsp[-2].nodeval, Node_if_branches, yyvsp[0].nodeval));;
  1712.     break;}
  1713. case 120:
  1714. #line 577 "awk.y"
  1715. { yyval.nodeval = yyvsp[0].nodeval; ;
  1716.     break;}
  1717. case 121:
  1718. #line 579 "awk.y"
  1719. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_concat, yyvsp[0].nodeval); ;
  1720.     break;}
  1721. case 122:
  1722. #line 584 "awk.y"
  1723. { yyval.nodeval = node (yyvsp[0].nodeval, Node_not,(NODE *) NULL); ;
  1724.     break;}
  1725. case 123:
  1726. #line 586 "awk.y"
  1727. { yyval.nodeval = yyvsp[-1].nodeval; ;
  1728.     break;}
  1729. case 124:
  1730. #line 588 "awk.y"
  1731. { yyval.nodeval = snode (yyvsp[-1].nodeval, Node_builtin, yyvsp[-3].ptrval); ;
  1732.     break;}
  1733. case 125:
  1734. #line 590 "awk.y"
  1735. { yyval.nodeval = snode (yyvsp[-1].nodeval, Node_builtin, yyvsp[-3].ptrval); ;
  1736.     break;}
  1737. case 126:
  1738. #line 592 "awk.y"
  1739. { yyval.nodeval = snode ((NODE *)NULL, Node_builtin, yyvsp[0].ptrval); ;
  1740.     break;}
  1741. case 127:
  1742. #line 594 "awk.y"
  1743. {
  1744.         yyval.nodeval = node (yyvsp[-1].nodeval, Node_func_call, make_string(yyvsp[-3].sval, strlen(yyvsp[-3].sval)));
  1745.       ;
  1746.     break;}
  1747. case 128:
  1748. #line 598 "awk.y"
  1749. { yyval.nodeval = node (yyvsp[0].nodeval, Node_preincrement, (NODE *)NULL); ;
  1750.     break;}
  1751. case 129:
  1752. #line 600 "awk.y"
  1753. { yyval.nodeval = node (yyvsp[0].nodeval, Node_predecrement, (NODE *)NULL); ;
  1754.     break;}
  1755. case 130:
  1756. #line 602 "awk.y"
  1757. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_postincrement, (NODE *)NULL); ;
  1758.     break;}
  1759. case 131:
  1760. #line 604 "awk.y"
  1761. { yyval.nodeval = node (yyvsp[-1].nodeval, Node_postdecrement, (NODE *)NULL); ;
  1762.     break;}
  1763. case 132:
  1764. #line 606 "awk.y"
  1765. { yyval.nodeval = yyvsp[0].nodeval; ;
  1766.     break;}
  1767. case 133:
  1768. #line 608 "awk.y"
  1769. { yyval.nodeval = yyvsp[0].nodeval; ;
  1770.     break;}
  1771. case 134:
  1772. #line 610 "awk.y"
  1773. { yyval.nodeval = yyvsp[0].nodeval; ;
  1774.     break;}
  1775. case 135:
  1776. #line 614 "awk.y"
  1777. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_exp, yyvsp[0].nodeval); ;
  1778.     break;}
  1779. case 136:
  1780. #line 616 "awk.y"
  1781. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_times, yyvsp[0].nodeval); ;
  1782.     break;}
  1783. case 137:
  1784. #line 618 "awk.y"
  1785. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_quotient, yyvsp[0].nodeval); ;
  1786.     break;}
  1787. case 138:
  1788. #line 620 "awk.y"
  1789. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_mod, yyvsp[0].nodeval); ;
  1790.     break;}
  1791. case 139:
  1792. #line 622 "awk.y"
  1793. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_plus, yyvsp[0].nodeval); ;
  1794.     break;}
  1795. case 140:
  1796. #line 624 "awk.y"
  1797. { yyval.nodeval = node (yyvsp[-2].nodeval, Node_minus, yyvsp[0].nodeval); ;
  1798.     break;}
  1799. case 141:
  1800. #line 626 "awk.y"
  1801. { yyval.nodeval = node (yyvsp[0].nodeval, Node_unary_minus, (NODE *)NULL); ;
  1802.     break;}
  1803. case 142:
  1804. #line 628 "awk.y"
  1805. { yyval.nodeval = yyvsp[0].nodeval; ;
  1806.     break;}
  1807. case 143:
  1808. #line 633 "awk.y"
  1809. { yyval.nodeval = NULL; ;
  1810.     break;}
  1811. case 144:
  1812. #line 635 "awk.y"
  1813. { yyval.nodeval = yyvsp[0].nodeval; ;
  1814.     break;}
  1815. case 145:
  1816. #line 640 "awk.y"
  1817. { want_assign = 1; yyval.nodeval = variable (yyvsp[0].sval); ;
  1818.     break;}
  1819. case 146:
  1820. #line 642 "awk.y"
  1821. { want_assign = 1; yyval.nodeval = node (variable(yyvsp[-3].sval), Node_subscript, yyvsp[-1].nodeval); ;
  1822.     break;}
  1823. case 147:
  1824. #line 644 "awk.y"
  1825. { want_assign = 1; yyval.nodeval = node (yyvsp[0].nodeval, Node_field_spec, (NODE *)NULL); ;
  1826.     break;}
  1827. case 149:
  1828. #line 652 "awk.y"
  1829. { yyerrok; ;
  1830.     break;}
  1831. case 150:
  1832. #line 656 "awk.y"
  1833. { yyval.nodetypeval = Node_illegal; yyerrok; ;
  1834.     break;}
  1835. case 153:
  1836. #line 665 "awk.y"
  1837. { yyerrok; ;
  1838.     break;}
  1839. case 154:
  1840. #line 668 "awk.y"
  1841. { yyval.nodetypeval = Node_illegal; yyerrok; ;
  1842.     break;}
  1843. }
  1844.    /* the action file gets copied in in place of this dollarsign */
  1845. #line 327 "bison.simple"
  1846.  
  1847.   yyvsp -= yylen;
  1848.   yyssp -= yylen;
  1849. #ifdef YYLSP_NEEDED
  1850.   yylsp -= yylen;
  1851. #endif
  1852.  
  1853. #if YYDEBUG != 0
  1854.   if (yydebug)
  1855.     {
  1856.       short *ssp1 = yyss - 1;
  1857.       fprintf (stderr, "state stack now");
  1858.       while (ssp1 != yyssp)
  1859.     fprintf (stderr, " %d", *++ssp1);
  1860.       fprintf (stderr, "\n");
  1861.     }
  1862. #endif
  1863.  
  1864.   *++yyvsp = yyval;
  1865.  
  1866. #ifdef YYLSP_NEEDED
  1867.   yylsp++;
  1868.   if (yylen == 0)
  1869.     {
  1870.       yylsp->first_line = yylloc.first_line;
  1871.       yylsp->first_column = yylloc.first_column;
  1872.       yylsp->last_line = (yylsp-1)->last_line;
  1873.       yylsp->last_column = (yylsp-1)->last_column;
  1874.       yylsp->text = 0;
  1875.     }
  1876.   else
  1877.     {
  1878.       yylsp->last_line = (yylsp+yylen-1)->last_line;
  1879.       yylsp->last_column = (yylsp+yylen-1)->last_column;
  1880.     }
  1881. #endif
  1882.  
  1883.   /* Now "shift" the result of the reduction.
  1884.      Determine what state that goes to,
  1885.      based on the state we popped back to
  1886.      and the rule number reduced by.  */
  1887.  
  1888.   yyn = yyr1[yyn];
  1889.  
  1890.   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
  1891.   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
  1892.     yystate = yytable[yystate];
  1893.   else
  1894.     yystate = yydefgoto[yyn - YYNTBASE];
  1895.  
  1896.   goto yynewstate;
  1897.  
  1898. yyerrlab:   /* here on detecting error */
  1899.  
  1900.   if (! yyerrstatus)
  1901.     /* If not already recovering from an error, report this error.  */
  1902.     {
  1903.       ++yynerrs;
  1904.       yyerror("parse error");
  1905.     }
  1906.  
  1907.   if (yyerrstatus == 3)
  1908.     {
  1909.       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
  1910.  
  1911.       /* return failure if at end of input */
  1912.       if (yychar == YYEOF)
  1913.     YYABORT;
  1914.  
  1915. #if YYDEBUG != 0
  1916.       if (yydebug)
  1917.     fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
  1918. #endif
  1919.  
  1920.       yychar = YYEMPTY;
  1921.     }
  1922.  
  1923.   /* Else will try to reuse lookahead token
  1924.      after shifting the error token.  */
  1925.  
  1926.   yyerrstatus = 3;        /* Each real token shifted decrements this */
  1927.  
  1928.   goto yyerrhandle;
  1929.  
  1930. yyerrdefault:  /* current state does not do anything special for the error token. */
  1931.  
  1932. #if 0
  1933.   /* This is wrong; only states that explicitly want error tokens
  1934.      should shift them.  */
  1935.   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
  1936.   if (yyn) goto yydefault;
  1937. #endif
  1938.  
  1939. yyerrpop:   /* pop the current state because it cannot handle the error token */
  1940.  
  1941.   if (yyssp == yyss) YYABORT;
  1942.   yyvsp--;
  1943.   yystate = *--yyssp;
  1944. #ifdef YYLSP_NEEDED
  1945.   yylsp--;
  1946. #endif
  1947.  
  1948. #if YYDEBUG != 0
  1949.   if (yydebug)
  1950.     {
  1951.       short *ssp1 = yyss - 1;
  1952.       fprintf (stderr, "Error: state stack now");
  1953.       while (ssp1 != yyssp)
  1954.     fprintf (stderr, " %d", *++ssp1);
  1955.       fprintf (stderr, "\n");
  1956.     }
  1957. #endif
  1958.  
  1959. yyerrhandle:
  1960.  
  1961.   yyn = yypact[yystate];
  1962.   if (yyn == YYFLAG)
  1963.     goto yyerrdefault;
  1964.  
  1965.   yyn += YYTERROR;
  1966.   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
  1967.     goto yyerrdefault;
  1968.  
  1969.   yyn = yytable[yyn];
  1970.   if (yyn < 0)
  1971.     {
  1972.       if (yyn == YYFLAG)
  1973.     goto yyerrpop;
  1974.       yyn = -yyn;
  1975.       goto yyreduce;
  1976.     }
  1977.   else if (yyn == 0)
  1978.     goto yyerrpop;
  1979.  
  1980.   if (yyn == YYFINAL)
  1981.     YYACCEPT;
  1982.  
  1983. #if YYDEBUG != 0
  1984.   if (yydebug)
  1985.     fprintf(stderr, "Shifting error token, ");
  1986. #endif
  1987.  
  1988.   *++yyvsp = yylval;
  1989. #ifdef YYLSP_NEEDED
  1990.   *++yylsp = yylloc;
  1991. #endif
  1992.  
  1993.   yystate = yyn;
  1994.   goto yynewstate;
  1995. }
  1996. #line 671 "awk.y"
  1997.  
  1998.  
  1999. struct token {
  2000.     char *operator;        /* text to match */
  2001.     NODETYPE value;        /* node type */
  2002.     short class;        /* lexical class */
  2003.     short nostrict;        /* ignore if in strict compatibility mode */
  2004.     NODE *(*ptr) ();    /* function that implements this keyword */
  2005. };
  2006.  
  2007. extern NODE
  2008.     *do_exp(NODE *tree),    
  2009.     *do_getline(NODE *tree),    
  2010.     *do_index(NODE *tree),    
  2011.     *do_length(NODE *tree),
  2012.     *do_sqrt(NODE *tree),    
  2013.     *do_log(NODE *tree),    
  2014.     *do_sprintf(NODE *tree),    
  2015.     *do_substr(NODE *tree),
  2016.     *do_split(NODE *tree),    
  2017.     *do_system(NODE *tree),    
  2018.     *do_int(NODE *tree),    
  2019.     *do_close(NODE *tree),
  2020.     *do_atan2(NODE *tree),    
  2021.     *do_sin(NODE *tree),    
  2022.     *do_cos(NODE *tree),    
  2023.     *do_rand(NODE *tree),
  2024.     *do_srand(NODE *tree),    
  2025.     *do_match(NODE *tree),    
  2026.     *do_tolower(NODE *tree),    
  2027.     *do_toupper(NODE *tree),
  2028.     *do_sub(NODE *tree),    
  2029.     *do_gsub(NODE *tree),
  2030.     /* added for Mac version */
  2031.     *do_lookup(NODE *tree),
  2032.     *do_sort(NODE *tree),
  2033.     *do_time(NODE *tree),
  2034.     *do_prompt(NODE *tree),
  2035.     *do_progress(NODE *tree),
  2036.     *do_hAWK(NODE *tree),
  2037.     *do_beep(NODE *tree),
  2038.     *do_copy(NODE *tree),
  2039.     *do_exists(NODE *tree),
  2040.     *do_fdate(NODE *tree),
  2041.     *do_fsize(NODE *tree),
  2042.     *do_getclip(NODE *tree),
  2043.     *do_putclip(NODE *tree),
  2044.     *do_list(NODE *tree),
  2045.     *do_nested(NODE *tree),
  2046.     *do_remove(NODE *tree),
  2047.     *do_rename(NODE *tree);
  2048.  
  2049. /* Special functions for debugging */
  2050. #ifdef DEBUG
  2051. NODE *do_prvars(), *do_bp();
  2052. #endif
  2053.  
  2054. /* Tokentab is sorted ascii ascending order, so it can be binary searched. */
  2055. /* In an application this is OK...
  2056. static struct token tokentab[] = {
  2057.     { "BEGIN",    Node_illegal,        LEX_BEGIN,    0,    0 },
  2058.     { "END",    Node_illegal,        LEX_END,    0,    0 },
  2059.     { "atan2",    Node_builtin,        LEX_BUILTIN,    0,    do_atan2 },
  2060.     { "beep",    Node_builtin,        LEX_BUILTIN,    0,    do_beep}, -- Mac version only --
  2061. #ifdef DEBUG
  2062.     { "bp",        Node_builtin,        LEX_BUILTIN,    0,    do_bp },
  2063. #endif
  2064.     { "break",    Node_K_break,        LEX_BREAK,    0,    0 },
  2065.     { "close",    Node_builtin,        LEX_BUILTIN,    0,    do_close },
  2066.     { "continue",    Node_K_continue,    LEX_CONTINUE,    0,    0 },
  2067.     { "copy",    Node_builtin,        LEX_BUILTIN,    0,    do_copy}, -- Mac version only --
  2068.     { "cos",    Node_builtin,        LEX_BUILTIN,    0,    do_cos },
  2069.     { "delete",    Node_K_delete,        LEX_DELETE,    0,    0 },
  2070.     { "do",        Node_K_do,        LEX_DO,        0,    0 },
  2071.     { "else",    Node_illegal,        LEX_ELSE,    0,    0 },
  2072.     { "exists",    Node_builtin,        LEX_BUILTIN,    0,    do_exists}, -- Mac version only --
  2073.     { "exit",    Node_K_exit,        LEX_EXIT,    0,    0 },
  2074.     { "exp",    Node_builtin,        LEX_BUILTIN,    0,    do_exp },
  2075.     { "fdate",    Node_builtin,        LEX_BUILTIN,    0,    do_fdate}, -- Mac version only --
  2076.     { "for",    Node_K_for,        LEX_FOR,    0,    0 },
  2077.     { "fsize",    Node_builtin,        LEX_BUILTIN,    0,    do_fsize}, -- Mac version only --
  2078.     { "func",    Node_K_function,    LEX_FUNCTION,    0,    0 },
  2079.     { "function",    Node_K_function,    LEX_FUNCTION,    0,    0 },
  2080.     { "getclip",    Node_builtin,        LEX_BUILTIN,    0,    do_getclip}, -- Mac version only --
  2081.     { "getline",    Node_K_getline,        LEX_GETLINE,    0,    0 },
  2082.     { "gsub",    Node_builtin,        LEX_BUILTIN,    0,    do_gsub },
  2083.     { "hAWK",    Node_builtin,        LEX_BUILTIN,    0,    do_hAWK}, -- Mac version only --
  2084.     { "if",        Node_K_if,        LEX_IF,        0,    0 },
  2085.     { "in",        Node_illegal,        LEX_IN,        0,    0 },
  2086.     { "index",    Node_builtin,        LEX_BUILTIN,    0,    do_index },
  2087.     { "int",    Node_builtin,        LEX_BUILTIN,    0,    do_int },
  2088.     { "length",    Node_builtin,        LEX_LENGTH,    0,    do_length },
  2089.     { "list",    Node_builtin,        LEX_BUILTIN,    0,    do_list}, -- Mac version only --
  2090.     { "log",    Node_builtin,        LEX_BUILTIN,    0,    do_log },
  2091.     { "lookup",    Node_builtin,        LEX_LENGTH,    0,    do_lookup }, -- Mac version only --
  2092.     { "match",    Node_builtin,        LEX_BUILTIN,    0,    do_match },
  2093.     { "nested",    Node_builtin,        LEX_BUILTIN,    0,    do_nested}, -- Mac version only --
  2094.     { "next",    Node_K_next,        LEX_NEXT,    0,    0 },
  2095.     { "print",    Node_K_print,        LEX_PRINT,    0,    0 },
  2096.     { "printf",    Node_K_printf,        LEX_PRINTF,    0,    0 },
  2097.     { "progress",Node_builtin,        LEX_BUILTIN,    0,    do_progress }, -- Mac version only --
  2098.     { "prompt",    Node_builtin,        LEX_BUILTIN,    0,    do_prompt }, -- Mac version only --
  2099. #ifdef DEBUG
  2100.     { "prvars",    Node_builtin,        LEX_BUILTIN,    0,    do_prvars },
  2101. #endif
  2102.     { "putclip",    Node_builtin,        LEX_BUILTIN,    0,    do_putclip}, -- Mac version only --
  2103.     { "rand",    Node_builtin,        LEX_BUILTIN,    0,    do_rand },
  2104.     { "remove",    Node_builtin,        LEX_BUILTIN,    0,    do_remove}, -- Mac version only --
  2105.     { "rename",    Node_builtin,        LEX_BUILTIN,    0,    do_rename}, -- Mac version only --
  2106.     { "return",    Node_K_return,        LEX_RETURN,    0,    0 },
  2107.     { "sin",    Node_builtin,        LEX_BUILTIN,    0,    do_sin },
  2108.     { "sort",    Node_builtin,        LEX_BUILTIN,    0,    do_sort}, -- Mac version only --
  2109.     { "split",    Node_builtin,        LEX_BUILTIN,    0,    do_split },
  2110.     { "sprintf",    Node_builtin,        LEX_BUILTIN,    0,    do_sprintf },
  2111.     { "sqrt",    Node_builtin,        LEX_BUILTIN,    0,    do_sqrt },
  2112.     { "srand",    Node_builtin,        LEX_BUILTIN,    0,    do_srand },
  2113.     { "sub",    Node_builtin,        LEX_BUILTIN,    0,    do_sub },
  2114.     { "substr",    Node_builtin,        LEX_BUILTIN,    0,    do_substr },
  2115.     { "system",    Node_builtin,        LEX_BUILTIN,    0,    do_system },
  2116.     { "time",    Node_builtin,        LEX_BUILTIN,    0,    do_time }, -- Mac version only --
  2117.     { "tolower",    Node_builtin,        LEX_BUILTIN,    0,    do_tolower },
  2118.     { "toupper",    Node_builtin,        LEX_BUILTIN,    0,    do_toupper },
  2119.     { "while",    Node_K_while,        LEX_WHILE,    0,    0 },
  2120. };
  2121. */
  2122. /* ...but in a code resource it has to be done the hard way...*/
  2123. #ifdef DEBUG
  2124. static struct token tokentab[59];
  2125. #else
  2126. static struct token tokentab[57];
  2127. #endif
  2128.  
  2129. static short statTokTabNum = 0;
  2130. static void InitOneToken(
  2131.             char *operator,        /* text to match */
  2132.             NODETYPE value,        /* node type */
  2133.             short class,            /* lexical class */
  2134.             short nostrict,        /* ignore if in strict compatibility mode */
  2135.             NODE *(*ptr) ()        /* function that implements this keyword */);
  2136. static void InitOneToken(
  2137.             char *operator,        /* text to match */
  2138.             NODETYPE value,        /* node type */
  2139.             short class,            /* lexical class */
  2140.             short nostrict,        /* ignore if in strict compatibility mode */
  2141.             NODE *(*ptr) ()        /* function that implements this keyword */)
  2142.     {
  2143.     tokentab[statTokTabNum].operator = operator;
  2144.     tokentab[statTokTabNum].value = value;
  2145.     tokentab[statTokTabNum].class = class;
  2146.     tokentab[statTokTabNum].nostrict = nostrict;
  2147.     tokentab[statTokTabNum].ptr = ptr;
  2148.     ++statTokTabNum;
  2149.     }
  2150.     
  2151. static void InitTokentab(void);
  2152. static void InitTokentab()
  2153.     {
  2154.     InitOneToken("BEGIN",    Node_illegal,        LEX_BEGIN,    0,    0);
  2155.     InitOneToken("END",        Node_illegal,        LEX_END,    0,    0 );
  2156.     InitOneToken("atan2",    Node_builtin,        LEX_BUILTIN,    0,    do_atan2 );
  2157.     InitOneToken("beep",    Node_builtin,        LEX_BUILTIN,    0,    do_beep ); /* Mac version only */
  2158. #ifdef DEBUG
  2159.     InitOneToken("bp",        Node_builtin,        LEX_BUILTIN,    0,    do_bp );
  2160. #endif
  2161.     InitOneToken("break",    Node_K_break,        LEX_BREAK,    0,    0 );
  2162.     InitOneToken("close",    Node_builtin,        LEX_BUILTIN,    0,    do_close );
  2163.     InitOneToken("continue",Node_K_continue,    LEX_CONTINUE,    0,    0 );
  2164.     InitOneToken("copy",    Node_builtin,        LEX_BUILTIN,    0,    do_copy ); /* Mac version only */
  2165.     InitOneToken("cos",        Node_builtin,        LEX_BUILTIN,    0,    do_cos );
  2166.     InitOneToken("delete",    Node_K_delete,        LEX_DELETE,    0,    0 );
  2167.     InitOneToken("do",        Node_K_do,            LEX_DO,        0,    0 );
  2168.     InitOneToken("else",    Node_illegal,        LEX_ELSE,    0,    0 );
  2169.     InitOneToken("exists",    Node_builtin,        LEX_BUILTIN,    0,    do_exists ); /* Mac version only */
  2170.     InitOneToken("exit",    Node_K_exit,        LEX_EXIT,    0,    0 );
  2171.     InitOneToken("exp",        Node_builtin,        LEX_BUILTIN,    0,    do_exp );
  2172.     InitOneToken("fdate",    Node_builtin,        LEX_BUILTIN,    0,    do_fdate ); /* Mac version only */
  2173.     InitOneToken("for",        Node_K_for,            LEX_FOR,    0,    0 );
  2174.     InitOneToken("fsize",    Node_builtin,        LEX_BUILTIN,    0,    do_fsize ); /* Mac version only */
  2175.     InitOneToken("func",    Node_K_function,    LEX_FUNCTION,    0,    0 );
  2176.     InitOneToken("function",Node_K_function,    LEX_FUNCTION,    0,    0 );
  2177.     InitOneToken("getclip",    Node_builtin,        LEX_BUILTIN,    0,    do_getclip ); /* Mac version only */
  2178.     InitOneToken("getline",    Node_K_getline,        LEX_GETLINE,    0,    0 );
  2179.     InitOneToken("gsub",    Node_builtin,        LEX_BUILTIN,    0,    do_gsub );
  2180.     InitOneToken("hAWK",    Node_builtin,        LEX_BUILTIN,    0,    do_hAWK ); /* Mac version only */
  2181.     InitOneToken("if",        Node_K_if,            LEX_IF,        0,    0 );
  2182.     InitOneToken("in",        Node_illegal,        LEX_IN,        0,    0 );
  2183.     InitOneToken("index",    Node_builtin,        LEX_BUILTIN,    0,    do_index );
  2184.     InitOneToken("int",        Node_builtin,        LEX_BUILTIN,    0,    do_int );
  2185.     InitOneToken("length",    Node_builtin,        LEX_LENGTH,    0,    do_length );
  2186.     InitOneToken("list",    Node_builtin,        LEX_BUILTIN,    0,    do_list ); /* Mac version only */
  2187.     InitOneToken("log",        Node_builtin,        LEX_BUILTIN,    0,    do_log );
  2188.     InitOneToken("lookup",    Node_builtin,        LEX_LENGTH,    0,    do_lookup ); /* Mac version only */
  2189.     InitOneToken("match",    Node_builtin,        LEX_BUILTIN,    0,    do_match );
  2190.     InitOneToken("nested",    Node_builtin,        LEX_BUILTIN,    0,    do_nested ); /* Mac version only */
  2191.     InitOneToken("next",    Node_K_next,        LEX_NEXT,    0,    0 );
  2192.     InitOneToken("print",    Node_K_print,        LEX_PRINT,    0,    0 );
  2193.     InitOneToken("printf",    Node_K_printf,        LEX_PRINTF,    0,    0 );
  2194.     InitOneToken("progress",Node_builtin,        LEX_BUILTIN,    0,    do_progress ); /* Mac only */
  2195.     InitOneToken("prompt",    Node_builtin,        LEX_BUILTIN,    0,    do_prompt ); /* Mac only */
  2196. #ifdef DEBUG
  2197.     InitOneToken("prvars",    Node_builtin,        LEX_BUILTIN,    0,    do_prvars );
  2198. #endif
  2199.     InitOneToken("putclip",    Node_builtin,        LEX_BUILTIN,    0,    do_putclip ); /* Mac version only */
  2200.     InitOneToken("rand",    Node_builtin,        LEX_BUILTIN,    0,    do_rand );
  2201.     InitOneToken("remove",    Node_builtin,        LEX_BUILTIN,    0,    do_remove ); /* Mac version only */
  2202.     InitOneToken("rename",    Node_builtin,        LEX_BUILTIN,    0,    do_rename ); /* Mac version only */
  2203.     InitOneToken("return",    Node_K_return,        LEX_RETURN,    0,    0 );
  2204.     InitOneToken("sin",        Node_builtin,        LEX_BUILTIN,    0,    do_sin );
  2205.     InitOneToken("sort",    Node_builtin,        LEX_BUILTIN,    0,    do_sort); /* Mac version only */
  2206.     InitOneToken("split",    Node_builtin,        LEX_BUILTIN,    0,    do_split );
  2207.     InitOneToken("sprintf",    Node_builtin,        LEX_BUILTIN,    0,    do_sprintf );
  2208.     InitOneToken("sqrt",    Node_builtin,        LEX_BUILTIN,    0,    do_sqrt );
  2209.     InitOneToken("srand",    Node_builtin,        LEX_BUILTIN,    0,    do_srand );
  2210.     InitOneToken("sub",        Node_builtin,        LEX_BUILTIN,    0,    do_sub );
  2211.     InitOneToken("substr",    Node_builtin,        LEX_BUILTIN,    0,    do_substr );
  2212.     InitOneToken("system",    Node_builtin,        LEX_BUILTIN,    0,    do_system );
  2213.     InitOneToken("time",    Node_builtin,        LEX_BUILTIN,    0,    do_time ); /* Mac version only */
  2214.     InitOneToken("tolower",    Node_builtin,        LEX_BUILTIN,    0,    do_tolower );
  2215.     InitOneToken("toupper",    Node_builtin,        LEX_BUILTIN,    0,    do_toupper );
  2216.     InitOneToken("while",    Node_K_while,        LEX_WHILE,    0,    0 );
  2217.     }
  2218.  
  2219. /* THINK C has a real simple line termination rule:
  2220. sometimes it's '\n', sometimes it's '\r'. This changes according to whether you're
  2221. doing ANSI, unix, or Mac-style file handling, and of course input is not necessarily
  2222. the same as output....Anyone wanna write a thesis about this? */
  2223. #define CR '\n'
  2224.  
  2225.  
  2226. static char *token_start;
  2227.  
  2228. /* VARARGS0 */
  2229. static void yyerror(char *va_alist, ...)
  2230. {
  2231.     va_list args;
  2232.     char *mesg;
  2233.     register char *ptr, *beg;
  2234.     char *scan;
  2235.     char    oof[14];
  2236.  
  2237.     errcount++;
  2238.     va_start(args, va_alist);
  2239.     mesg = va_arg(args, char *);
  2240.     va_end(args);
  2241.     /* Find the current line in the input file */
  2242.     if (! lexptr) {
  2243.         short    i = 0;
  2244.         oof[i++] = '(';
  2245.         oof[i++] = 'E';
  2246.         oof[i++] = 'N';
  2247.         oof[i++] = 'D';
  2248.         oof[i++] = ' ';
  2249.         oof[i++] = 'O';
  2250.         oof[i++] = 'F';
  2251.         oof[i++] = ' ';
  2252.         oof[i++] = 'F';
  2253.         oof[i++] = 'I';
  2254.         oof[i++] = 'L';
  2255.         oof[i++] = 'E';
  2256.         oof[i++] = ')';
  2257.         beg = oof;
  2258.         ptr = beg + 13;
  2259.     } else {
  2260.         if (*lexptr == CR && lexptr != lexptr_begin)
  2261.             --lexptr;
  2262.         for (beg = lexptr; beg != lexptr_begin && *beg != CR; --beg)
  2263.             ;
  2264.         /* NL isn't guaranteed */
  2265.         for (ptr = lexptr; *ptr && *ptr != CR; ptr++)
  2266.             ;
  2267.         if (beg != lexptr_begin)
  2268.             beg++;
  2269.         if (ptr <= beg+1)
  2270.             for (++ptr; *ptr && *ptr != CR; ptr++)
  2271.                 ;
  2272.     }
  2273.     msg("syntax error near line %d:\n%.*s", lineno, (short)(ptr - beg), beg);
  2274.     scan = beg;
  2275.     while (scan < token_start)
  2276.         if (*scan++ == '\t')
  2277.             putc('\t', stderr);
  2278.         else
  2279.             putc(' ', stderr);
  2280.     putc('^', stderr);
  2281.     putc(' ', stderr);
  2282.     //vfprintf(stderr, mesg, args);
  2283.     vfprintf(stderr, va_alist, args);
  2284.     putc('\n', stderr);
  2285.     exit(1);
  2286. }
  2287.  
  2288.  
  2289.  
  2290. /*
  2291.  * Parse a C escape sequence.  STRING_PTR points to a variable containing a
  2292.  * pointer to the string to parse.  That pointer is updated past the
  2293.  * characters we use.  The value of the escape sequence is returned. 
  2294.  *
  2295.  * A negative value means the sequence \ newline was seen, which is supposed to
  2296.  * be equivalent to nothing at all. 
  2297.  *
  2298.  * If \ is followed by a null character, we return a negative value and leave
  2299.  * the string pointer pointing at the null character. 
  2300.  *
  2301.  * If \ is followed by 000, we return 0 and leave the string pointer after the
  2302.  * zeros.  A value of 0 does not mean end of string.  
  2303.  
  2304. Mac revision: for convenience when tagging subgroups, the sequences
  2305. \1 through \9 are left intact (provided another digit doesn't follow).
  2306. Also, the special combinations \w, \W, \<, \>, \b, \B, which are
  2307. very handy in regular expressions for matching word boundaries etc
  2308. are left intact.
  2309. See group_tag_etc() in NODE.C.
  2310.  */
  2311.  
  2312. short parse_escape(char **string_ptr)
  2313. {
  2314.     register short c = *(*string_ptr)++;
  2315.     register short i;
  2316.     register short count = 0;
  2317.  
  2318.     switch (c) {
  2319.     case 'a':
  2320.         return BELL;
  2321.     case 'b':
  2322.         return '\b';
  2323.     case 'f':
  2324.         return '\f';
  2325.     case 'n':
  2326.         return '\n';
  2327.     case 'r':
  2328.         return '\r';
  2329.     case 't':
  2330.         return '\t';
  2331.     case 'v':
  2332.         return '\v';
  2333.     case CR:
  2334.         return -2;
  2335.     case 0:
  2336.         (*string_ptr)--;
  2337.         return -1;
  2338.     case '0':
  2339.     case '1':
  2340.     case '2':
  2341.     case '3':
  2342.     case '4':
  2343.     case '5':
  2344.     case '6':
  2345.     case '7':
  2346.         i = c - '0';
  2347.         count = 0;
  2348.         while (++count < 3) {
  2349.             if ((c = *(*string_ptr)++) >= '0' && c <= '7') {
  2350.                 i *= 8;
  2351.                 i += c - '0';
  2352.             } else {
  2353.                 (*string_ptr)--;
  2354.                 break;
  2355.             }
  2356.         }
  2357.         return i;
  2358.     case 'x':
  2359.         i = 0;
  2360.         while (1) {
  2361.             if (isxdigit((c = *(*string_ptr)++))) {
  2362.                 if (isdigit(c))
  2363.                     i += c - '0';
  2364.                 else if (isupper(c))
  2365.                     i += c - 'A' + 10;
  2366.                 else
  2367.                     i += c - 'a' + 10;
  2368.             } else {
  2369.                 (*string_ptr)--;
  2370.                 break;
  2371.             }
  2372.         }
  2373.         return i;
  2374.     default:
  2375.         return c;
  2376.     }
  2377. }
  2378.  
  2379.  
  2380. /*
  2381.  * Read the input and turn it into tokens. Input is now read from a file
  2382.  * instead of from malloc'ed memory. The main program takes a program
  2383.  * passed as a command line argument and writes it to a temp file. Otherwise
  2384.  * the file name is made available in an external variable.
  2385.  */
  2386. /* Statics moved outside yylex() for the Mac version
  2387. so they can be reinitialized easily. */
  2388. static did_newline = 0;    /* the grammar insists that actions end
  2389.              * with newlines.  This was easier than
  2390.              * hacking the grammar. */
  2391. static short file_opened = 0;
  2392. static FILE *fin;
  2393. static char cbuf[BUFSIZ];
  2394. static short yylex()
  2395. {
  2396.     register short c;
  2397.     register short namelen;
  2398.     register char *tokstart;
  2399.     char *tokkey;
  2400.     
  2401.     short seen_e = 0;        /* These are for numbers */
  2402.     short seen_point = 0;
  2403.     short esc_seen;
  2404.     extern char **sourcefile;
  2405.     extern short tempsource, numfiles;
  2406.     
  2407.     
  2408.     
  2409.     short low, mid, high;
  2410. #ifdef DEBUG
  2411.     extern short debugging;
  2412. #endif
  2413.  
  2414.     if (! file_opened) {
  2415.         file_opened = 1;
  2416. #ifdef DEBUG
  2417.         if (debugging) {
  2418.             short i;
  2419.  
  2420.             for (i = 0; i <= numfiles; i++)
  2421.                 fprintf (stderr, "sourcefile[%d] = %s\n", i,
  2422.                         sourcefile[i]);
  2423.         }
  2424. #endif
  2425.     nextfile:
  2426.         if ((fin = pathopen (sourcefile[++curinfile])) == NULL)
  2427.             fatal("cannot open `%s' for reading (%s)",
  2428.                 sourcefile[curinfile],
  2429.                 strerror(errno));
  2430.         *(lexptr = cbuf) = '\0';
  2431.         /*
  2432.          * immediately unlink the tempfile so that it will
  2433.          * go away cleanly if we bomb.
  2434.          */
  2435.         if (tempsource && curinfile == 0)
  2436.             (void) remove (sourcefile[curinfile]);
  2437.     }
  2438.  
  2439. retry:
  2440.     if (! *lexptr)
  2441.         if (fgets (cbuf, sizeof cbuf, fin) == NULL) {
  2442.             if (fin != NULL)
  2443.                 fclose (fin);    /* be neat and clean */
  2444.             if (curinfile < numfiles)
  2445.                 goto nextfile;
  2446.             return 0;
  2447.         } else
  2448.             lexptr = lexptr_begin = cbuf;
  2449.  
  2450.     if (want_regexp) {
  2451.         short in_brack = 0;
  2452.  
  2453.         want_regexp = 0;
  2454.         token_start = tokstart = lexptr;
  2455.         while (c = *lexptr++) {
  2456.             switch (c) {
  2457.             case '[':
  2458.                 in_brack = 1;
  2459.                 break;
  2460.             case ']':
  2461.                 in_brack = 0;
  2462.                 break;
  2463.             case '\\':
  2464.                 if (*lexptr++ == '\0') {
  2465.                     yyerror("unterminated regexp ends with \\");
  2466.                     return ERROR;
  2467.                 } else if (lexptr[-1] == CR)
  2468.                     goto retry;
  2469.                 break;
  2470.             case '/':    /* end of the regexp */
  2471.                 if (in_brack)
  2472.                     break;
  2473.  
  2474.                 lexptr--;
  2475.                 yylval.sval = tokstart;
  2476.                 return REGEXP;
  2477.             case CR:
  2478.                 lineno++;
  2479.             case '\0':
  2480.                 lexptr--;    /* so error messages work */
  2481.                 yyerror("unterminated regexp");
  2482.                 return ERROR;
  2483.             }
  2484.         }
  2485.     }
  2486.  
  2487.     if (*lexptr == CR) {
  2488.         lexptr++;
  2489.         lineno++;
  2490.         return NEWLINE;
  2491.     }
  2492.  
  2493.     while (*lexptr == ' ' || *lexptr == '\t')
  2494.         lexptr++;
  2495.  
  2496.     token_start = tokstart = lexptr;
  2497.  
  2498.     switch (c = *lexptr++) {
  2499.     case 0:
  2500.         return 0;
  2501.  
  2502.     case CR:
  2503.         lineno++;
  2504.         return NEWLINE;
  2505.  
  2506.     case '#':        /* it's a comment */
  2507.         while (*lexptr != CR && *lexptr != '\0')
  2508.             lexptr++;
  2509.         goto retry;
  2510.  
  2511.     case '\\':
  2512.         if (*lexptr == CR) {
  2513.             lineno++;
  2514.             lexptr++;
  2515.             goto retry;
  2516.         } else
  2517.             break;
  2518.     case ')':
  2519.     case ']':
  2520.     case '(':    
  2521.     case '[':
  2522.     case '$':
  2523.     case ';':
  2524.     case ':':
  2525.     case '?':
  2526.  
  2527.         /*
  2528.          * set node type to ILLEGAL because the action should set it
  2529.          * to the right thing 
  2530.          */
  2531.         yylval.nodetypeval = Node_illegal;
  2532.         return c;
  2533.  
  2534.     case '{':
  2535.     case ',':
  2536.         yylval.nodetypeval = Node_illegal;
  2537.         return c;
  2538.  
  2539.     case '*':
  2540.         if (*lexptr == '=') {
  2541.             yylval.nodetypeval = Node_assign_times;
  2542.             lexptr++;
  2543.             return ASSIGNOP;
  2544.         } else if (*lexptr == '*') {    /* make ** and **= aliases
  2545.                          * for ^ and ^= */
  2546.             if (lexptr[1] == '=') {
  2547.                 yylval.nodetypeval = Node_assign_exp;
  2548.                 lexptr += 2;
  2549.                 return ASSIGNOP;
  2550.             } else {
  2551.                 yylval.nodetypeval = Node_illegal;
  2552.                 lexptr++;
  2553.                 return '^';
  2554.             }
  2555.         }
  2556.         yylval.nodetypeval = Node_illegal;
  2557.         return c;
  2558.  
  2559.     case '/':
  2560.         if (want_assign && *lexptr == '=') {
  2561.             yylval.nodetypeval = Node_assign_quotient;
  2562.             lexptr++;
  2563.             return ASSIGNOP;
  2564.         }
  2565.         yylval.nodetypeval = Node_illegal;
  2566.         return c;
  2567.  
  2568.     case '%':
  2569.         if (*lexptr == '=') {
  2570.             yylval.nodetypeval = Node_assign_mod;
  2571.             lexptr++;
  2572.             return ASSIGNOP;
  2573.         }
  2574.         yylval.nodetypeval = Node_illegal;
  2575.         return c;
  2576.  
  2577.     case '^':
  2578.         if (*lexptr == '=') {
  2579.             yylval.nodetypeval = Node_assign_exp;
  2580.             lexptr++;
  2581.             return ASSIGNOP;
  2582.         }
  2583.         yylval.nodetypeval = Node_illegal;
  2584.         return c;
  2585.  
  2586.     case '+':
  2587.         if (*lexptr == '=') {
  2588.             yylval.nodetypeval = Node_assign_plus;
  2589.             lexptr++;
  2590.             return ASSIGNOP;
  2591.         }
  2592.         if (*lexptr == '+') {
  2593.             yylval.nodetypeval = Node_illegal;
  2594.             lexptr++;
  2595.             return INCREMENT;
  2596.         }
  2597.         yylval.nodetypeval = Node_illegal;
  2598.         return c;
  2599.  
  2600.     case '!':
  2601.         if (*lexptr == '=') {
  2602.             yylval.nodetypeval = Node_notequal;
  2603.             lexptr++;
  2604.             return RELOP;
  2605.         }
  2606.         if (*lexptr == '~') {
  2607.             yylval.nodetypeval = Node_nomatch;
  2608.             lexptr++;
  2609.             return MATCHOP;
  2610.         }
  2611.         yylval.nodetypeval = Node_illegal;
  2612.         return c;
  2613.  
  2614.     case '<':
  2615.         if (*lexptr == '=') {
  2616.             yylval.nodetypeval = Node_leq;
  2617.             lexptr++;
  2618.             return RELOP;
  2619.         }
  2620.         yylval.nodetypeval = Node_less;
  2621.         return c;
  2622.  
  2623.     case '=':
  2624.         if (*lexptr == '=') {
  2625.             yylval.nodetypeval = Node_equal;
  2626.             lexptr++;
  2627.             return RELOP;
  2628.         }
  2629.         yylval.nodetypeval = Node_assign;
  2630.         return ASSIGNOP;
  2631.  
  2632.     case '>':
  2633.         if (*lexptr == '=') {
  2634.             yylval.nodetypeval = Node_geq;
  2635.             lexptr++;
  2636.             return RELOP;
  2637.         } else if (*lexptr == '>') {
  2638.             yylval.nodetypeval = Node_redirect_append;
  2639.             lexptr++;
  2640.             return APPEND_OP;
  2641.         }
  2642.         yylval.nodetypeval = Node_greater;
  2643.         return c;
  2644.  
  2645.     case '~':
  2646.         yylval.nodetypeval = Node_match;
  2647.         return MATCHOP;
  2648.  
  2649.     case '}':
  2650.         /*
  2651.          * Added did newline stuff.  Easier than
  2652.          * hacking the grammar
  2653.          */
  2654.         if (did_newline) {
  2655.             did_newline = 0;
  2656.             return c;
  2657.         }
  2658.         did_newline++;
  2659.         --lexptr;
  2660.         return NEWLINE;
  2661.  
  2662.     case '"':
  2663.         esc_seen = 0;
  2664.         while (*lexptr != '\0') {
  2665.             switch (*lexptr++) {
  2666.             case '\\':
  2667.                 esc_seen = 1;
  2668.                 if (*lexptr == CR)
  2669.                     yyerror("newline in string");
  2670.                 if (*lexptr++ != '\0')
  2671.                     break;
  2672.                 /* fall through */
  2673.             case CR:
  2674.                 lexptr--;
  2675.                 yyerror("unterminated string");
  2676.                 return ERROR;
  2677.             case '"':
  2678.                 yylval.nodeval = make_str_node(tokstart + 1,
  2679.                         (short)(lexptr-tokstart-2), esc_seen);
  2680.                 yylval.nodeval->flags |= PERM;
  2681.                 return YSTRING;
  2682.             }
  2683.         }
  2684.         return ERROR;
  2685.  
  2686.     case '-':
  2687.         if (*lexptr == '=') {
  2688.             yylval.nodetypeval = Node_assign_minus;
  2689.             lexptr++;
  2690.             return ASSIGNOP;
  2691.         }
  2692.         if (*lexptr == '-') {
  2693.             yylval.nodetypeval = Node_illegal;
  2694.             lexptr++;
  2695.             return DECREMENT;
  2696.         }
  2697.         yylval.nodetypeval = Node_illegal;
  2698.         return c;
  2699.  
  2700.     case '0':
  2701.     case '1':
  2702.     case '2':
  2703.     case '3':
  2704.     case '4':
  2705.     case '5':
  2706.     case '6':
  2707.     case '7':
  2708.     case '8':
  2709.     case '9':
  2710.     case '.':
  2711.         /* It's a number */
  2712.         for (namelen = 0; (c = tokstart[namelen]) != '\0'; namelen++) {
  2713.             switch (c) {
  2714.             case '.':
  2715.                 if (seen_point)
  2716.                     goto got_number;
  2717.                 ++seen_point;
  2718.                 break;
  2719.             case 'e':
  2720.             case 'E':
  2721.                 if (seen_e)
  2722.                     goto got_number;
  2723.                 ++seen_e;
  2724.                 if (tokstart[namelen + 1] == '-' ||
  2725.                     tokstart[namelen + 1] == '+')
  2726.                     namelen++;
  2727.                 break;
  2728.             case '0':
  2729.             case '1':
  2730.             case '2':
  2731.             case '3':
  2732.             case '4':
  2733.             case '5':
  2734.             case '6':
  2735.             case '7':
  2736.             case '8':
  2737.             case '9':
  2738.                 break;
  2739.             default:
  2740.                 goto got_number;
  2741.             }
  2742.         }
  2743.  
  2744. got_number:
  2745.         lexptr = tokstart + namelen;
  2746.         /*
  2747.         yylval.nodeval = make_string(tokstart, namelen);
  2748.         (void) force_number(yylval.nodeval);
  2749.         */
  2750.         yylval.nodeval = make_number(atof(tokstart));
  2751.         yylval.nodeval->flags |= PERM;
  2752.         return NUMBER;
  2753.  
  2754.     case '&':
  2755.         if (*lexptr == '&') {
  2756.             yylval.nodetypeval = Node_and;
  2757.             while (c = *++lexptr) {
  2758.                 if (c == '#')
  2759.                     while ((c = *++lexptr) != CR
  2760.                            && c != '\0')
  2761.                         ;
  2762.                 if (c == CR)
  2763.                     lineno++;
  2764.                 else if (! isspace(c))
  2765.                     break;
  2766.             }
  2767.             return LEX_AND;
  2768.         }
  2769.         return ERROR;
  2770.  
  2771.     case '|':
  2772.         if (*lexptr == '|') {
  2773.             yylval.nodetypeval = Node_or;
  2774.             while (c = *++lexptr) {
  2775.                 if (c == '#')
  2776.                     while ((c = *++lexptr) != CR
  2777.                            && c != '\0')
  2778.                         ;
  2779.                 if (c == CR)
  2780.                     lineno++;
  2781.                 else if (! isspace(c))
  2782.                     break;
  2783.             }
  2784.             return LEX_OR;
  2785.         }
  2786.         yylval.nodetypeval = Node_illegal;
  2787.         return c;
  2788.     }
  2789.  
  2790.     if (c != '_' && ! isalpha(c)) {
  2791.         yyerror("Invalid char '%c' in expression\n", c);
  2792.         return ERROR;
  2793.     }
  2794.  
  2795.     /* it's some type of name-type-thing.  Find its length */
  2796.     for (namelen = 0; is_identchar(tokstart[namelen]); namelen++)
  2797.         /* null */ ;
  2798.     emalloc(tokkey, char *, namelen+1, "yylex");
  2799.     memcpy(tokkey, tokstart, namelen);
  2800.     tokkey[namelen] = '\0';
  2801.  
  2802.     /* See if it is a special token.  */
  2803.     low = 0;
  2804.     high = (sizeof (tokentab) / sizeof (tokentab[0])) - 1;
  2805.     while (low <= high) {
  2806.         short i, c;
  2807.  
  2808.         mid = (low + high) / 2;
  2809.         c = *tokstart - tokentab[mid].operator[0];
  2810.         i = c ? c : strcmp (tokkey, tokentab[mid].operator);
  2811.  
  2812.         if (i < 0) {        /* token < mid */
  2813.             high = mid - 1;
  2814.         } else if (i > 0) {    /* token > mid */
  2815.             low = mid + 1;
  2816.         } else {
  2817.             lexptr = tokstart + namelen;
  2818.             if (strict && tokentab[mid].nostrict)
  2819.                 break;
  2820.             if (tokentab[mid].class == LEX_BUILTIN
  2821.                 || tokentab[mid].class == LEX_LENGTH)
  2822.                 yylval.ptrval = tokentab[mid].ptr;
  2823.             else
  2824.                 yylval.nodetypeval = tokentab[mid].value;
  2825.             return tokentab[mid].class;
  2826.         }
  2827.     }
  2828.  
  2829.     /* It's a name.  See how long it is.  */
  2830.     yylval.sval = tokkey;
  2831.     lexptr = tokstart + namelen;
  2832.     if (*lexptr == '(')
  2833.         return FUNC_CALL;
  2834.     else
  2835.         return NAME;
  2836. }
  2837.  
  2838. #ifndef DEFPATH
  2839. #ifdef MSDOS
  2840. #define DEFPATH    "."
  2841. #define ENVSEP    ';'
  2842. #else
  2843. #define DEFPATH    ".:/usr/lib/awk:/usr/local/lib/awk"
  2844. #define ENVSEP    ':'
  2845. #endif
  2846. #endif
  2847.  
  2848. /* First Mac version: have strict == 1 so pathopen just opens the file
  2849. assuming a full path name. Later, have it handle
  2850. ::::vol:dirID:filename. Even later, have it handle unix slashes.
  2851. */
  2852. static FILE *pathopen(char *file)
  2853. {
  2854.     static char *savepath/* = DEFPATH*/;
  2855.     static short first = 1;
  2856.     char *awkpath, *cp;
  2857.     char trypath[BUFSIZ];
  2858.     FILE *fp;
  2859. #ifdef DEBUG
  2860.     extern short debugging;
  2861. #endif
  2862.     short fd;
  2863.  
  2864.     if (strcmp (file, "-") == 0)
  2865.         return (stdin);
  2866.  
  2867.     if (strict)
  2868.         return (fopen (file, "r"));
  2869.     // mac version, that's all folks.
  2870.     return NULL;
  2871. }
  2872.  
  2873. static NODE *node_common(NODETYPE op)
  2874. {
  2875.     register NODE *r;
  2876.     extern short numfiles;
  2877.     extern short tempsource;
  2878.     extern char **sourcefile;
  2879.  
  2880.     r = newnode(op);
  2881.     r->source_line = lineno;
  2882.     if (numfiles > -1 && ! tempsource)
  2883.         r->source_file = sourcefile[curinfile];
  2884.     else
  2885.         r->source_file = NULL;
  2886.     return r;
  2887. }
  2888.  
  2889. /*
  2890.  * This allocates a node with defined lnode and rnode. 
  2891.  * This should only be used by yyparse+co while reading in the program 
  2892.  */
  2893. NODE *node(NODE *left, NODETYPE op, NODE *right)
  2894. {
  2895.     register NODE *r;
  2896.  
  2897.     r = node_common(op);
  2898.     r->lnode = left;
  2899.     r->rnode = right;
  2900.     return r;
  2901. }
  2902.  
  2903. /*
  2904.  * This allocates a node with defined subnode and proc
  2905.  * Otherwise like node()
  2906.  */
  2907. static NODE *snode(NODE *subn, NODETYPE op, NODE *(*procp) ())
  2908. {
  2909.     register NODE *r;
  2910.  
  2911.     r = node_common(op);
  2912.     r->subnode = subn;
  2913.     r->proc = procp;
  2914.     return r;
  2915. }
  2916.  
  2917. /*
  2918.  * This allocates a Node_line_range node with defined condpair and
  2919.  * zeroes the trigger word to avoid the temptation of assuming that calling
  2920.  * 'node( foo, Node_line_range, 0)' will properly initialize 'triggered'. 
  2921.  */
  2922. /* Otherwise like node() */
  2923. static NODE *mkrangenode(NODE *cpair)
  2924. {
  2925.     register NODE *r;
  2926.  
  2927.     r = newnode(Node_line_range);
  2928.     r->condpair = cpair;
  2929.     r->triggered = 0;
  2930.     return r;
  2931. }
  2932.  
  2933. /* Build a for loop */
  2934. static NODE *make_for_loop(NODE *init, NODE *cond, NODE *incr)
  2935. {
  2936.     register FOR_LOOP_HEADER *r;
  2937.     NODE *n;
  2938.  
  2939.     emalloc(r, FOR_LOOP_HEADER *, sizeof(FOR_LOOP_HEADER), "make_for_loop");
  2940.     n = newnode(Node_illegal);
  2941.     r->init = init;
  2942.     r->cond = cond;
  2943.     r->incr = incr;
  2944.     n->sub.nodep.r.hd = r;
  2945.     return n;
  2946. }
  2947.  
  2948. /*
  2949.  * Install a name in the hash table specified, even if it is already there.
  2950.  * Name stops with first non alphanumeric. Caller must check against
  2951.  * redefinition if that is desired. 
  2952.  */
  2953. NODE *install(NODE **table, char *name, NODE *value)
  2954. {
  2955.     register NODE *hp;
  2956.     register short len, bucket;
  2957.     register char *p;
  2958.  
  2959.     len = 0;
  2960.     p = name;
  2961.     while (is_identchar(*p))
  2962.         p++;
  2963.     len = p - name;
  2964.  
  2965.     hp = newnode(Node_hashnode);
  2966.     bucket = hashf(name, len, HASHSIZE);
  2967.     hp->hnext = table[bucket];
  2968.     table[bucket] = hp;
  2969.     hp->hlength = len;
  2970.     hp->hvalue = value;
  2971.     emalloc(hp->hname, char *, len + 1, "install");
  2972.     memcpy(hp->hname, name, len);
  2973.     hp->hname[len] = '\0';
  2974.     return hp->hvalue;
  2975. }
  2976.  
  2977. /*
  2978.  * find the most recent hash node for name name (ending with first
  2979.  * non-identifier char) installed by install 
  2980.  */
  2981. NODE *lookup(NODE **table, char *name)
  2982. {
  2983.     register char *bp;
  2984.     register NODE *bucket;
  2985.     register short len;
  2986.  
  2987.     for (bp = name; is_identchar(*bp); bp++)
  2988.         ;
  2989.     len = bp - name;
  2990.     bucket = table[hashf(name, len, HASHSIZE)];
  2991.     while (bucket) {
  2992.         if (bucket->hlength == len && STREQN(bucket->hname, name, len))
  2993.             return bucket->hvalue;
  2994.         bucket = bucket->hnext;
  2995.     }
  2996.     return NULL;
  2997. }
  2998.  
  2999. #define HASHSTEP(old, c) ((old << 1) + c)
  3000. #define MAKE_POS(v) (v & ~0x80000000)    /* make number positive */
  3001.  
  3002. /*
  3003.  * return hash function on name.
  3004.  */
  3005. static short hashf(register char *name, register short len, short hashsize)
  3006. {
  3007.     register short r = 0;
  3008.  
  3009.     while (len--)
  3010.         r = HASHSTEP(r, *name++);
  3011.  
  3012.     r = MAKE_POS(r) % hashsize;
  3013.     return r;
  3014. }
  3015.  
  3016. /*
  3017.  * Add new to the rightmost branch of LIST.  This uses n^2 time, so we make
  3018.  * a simple attempt at optimizing it.
  3019.  */
  3020. /* statics moved outside for init */
  3021. static NODE *savefront = NULL, *savetail = NULL;
  3022. static NODE *append_right(NODE *list, NODE *new)
  3023. {
  3024.     register NODE *oldlist;
  3025.     
  3026.  
  3027.     oldlist = list;
  3028.     if (savefront == oldlist) {
  3029.         savetail = savetail->rnode = new;
  3030.         return oldlist;
  3031.     } else
  3032.         savefront = oldlist;
  3033.     while (list->rnode != NULL)
  3034.         list = list->rnode;
  3035.     savetail = list->rnode = new;
  3036.     return oldlist;
  3037. }
  3038.  
  3039. /*
  3040.  * check if name is already installed;  if so, it had better have Null value,
  3041.  * in which case def is added as the value. Otherwise, install name with def
  3042.  * as value. 
  3043.  */
  3044. static void func_install(NODE *params, NODE *def)
  3045. {
  3046.     NODE *r;
  3047.  
  3048.     pop_params(params->rnode);
  3049.     pop_var(params, 0);
  3050.     r = lookup(variables, params->param);
  3051.     if (r != NULL) {
  3052.         fatal("function name `%s' previously defined", params->param);
  3053.     } else
  3054.         (void) install(variables, params->param,
  3055.             node(params, Node_func, def));
  3056. }
  3057.  
  3058. static void pop_var(NODE *np, short freeit)
  3059. {
  3060.     register char *bp;
  3061.     register NODE *bucket, **save;
  3062.     register short len;
  3063.     char *name;
  3064.  
  3065.     name = np->param;
  3066.     for (bp = name; is_identchar(*bp); bp++)
  3067.         ;
  3068.     len = bp - name;
  3069.     save = &(variables[hashf(name, len, HASHSIZE)]);
  3070.     for (bucket = *save; bucket; bucket = bucket->hnext) {
  3071.         if (len == bucket->hlength && STREQN(bucket->hname, name, len)) {
  3072.             *save = bucket->hnext;
  3073.             freenode(bucket);
  3074.             free(bucket->hname);
  3075.             if (freeit)
  3076.                 free(np->param);
  3077.             return;
  3078.         }
  3079.         save = &(bucket->hnext);
  3080.     }
  3081. }
  3082.  
  3083. static void pop_params(NODE *params)
  3084. {
  3085.     register NODE *np;
  3086.  
  3087.     for (np = params; np != NULL; np = np->rnode)
  3088.         pop_var(np, 1);
  3089. }
  3090.  
  3091. static NODE *make_param(char *name)
  3092. {
  3093.     NODE *r;
  3094.  
  3095.     r = newnode(Node_param_list);
  3096.     r->param = name;
  3097.     r->rnode = NULL;
  3098.     r->param_cnt = param_counter++;
  3099.     return (install(variables, name, r));
  3100. }
  3101.  
  3102. /* Name points to a variable name.  Make sure its in the symbol table */
  3103. NODE *variable(char *name)
  3104. {
  3105.     register NODE *r;
  3106.  
  3107.     if ((r = lookup(variables, name)) == NULL)
  3108.         r = install(variables, name,
  3109.             node(Nnull_string, Node_var, (NODE *) NULL));
  3110.     return r;
  3111. }
  3112.  
  3113. /* Inits, required for CODE resource version of hAWK. */
  3114.  
  3115. extern void NullOut(char *str, long nBytes);
  3116.  
  3117. void InitAwkTabVars(void);
  3118.  
  3119. void InitAwkTabVars()
  3120.     {
  3121.     if (!hAWKstackDepth)
  3122.         {
  3123.         Inityytname();
  3124.         InitTokentab();
  3125.         }
  3126.     statTokTabNum = 0;
  3127.     
  3128.     
  3129.     want_regexp = 0;        /* lexical scanning kludge */
  3130.     want_assign = 0;        /* lexical scanning kludge */
  3131.     can_return = 0;        /* lexical scanning kludge */
  3132.     io_allowed = 1;    /* lexical scanning kludge */
  3133.     lineno = 1;        /* for error msgs */
  3134.     lexptr = NULL;        /* pointer to next char during parsing */
  3135.     lexptr_begin = NULL;    /* keep track of where we were for error msgs */
  3136.     curinfile = -1;    /* index into sourcefiles[] */
  3137.     param_counter = 0;
  3138.     NullOut((Ptr)variables, sizeof(NODE *)*HASHSIZE);
  3139.     errcount = 0;
  3140.     begin_block = NULL;
  3141.     end_block = NULL;
  3142. #ifndef YYIMPURE
  3143.     yychar = 0;            /*  the lookahead symbol        */
  3144.     NullOut((Ptr)(&yylval), sizeof(YYSTYPE));
  3145.     /*  the semantic value of the        */
  3146.                     /*  lookahead symbol            */
  3147.     NullOut((Ptr)(&yylloc), sizeof(YYLTYPE));
  3148.     /*  location data for the lookahead    */
  3149.                     /*  symbol                */
  3150.     yynerrs = 0;            /*  number of parse errors so far       */
  3151. #endif   /*YYIMPURE */
  3152.  
  3153.     token_start = NULL;
  3154.     
  3155.     /*- in yylex:*/
  3156.         did_newline = 0;
  3157.         file_opened = 0;
  3158.         fin = NULL;
  3159.         NullOut((Ptr)cbuf, BUFSIZ);
  3160.     /*- in *append_right:*/
  3161.         savefront = NULL; 
  3162.         savetail = NULL;
  3163.     
  3164.     }
  3165.  
  3166. void SaveAwkTabVars(void);
  3167. void RestoreAwkTabVars(void);
  3168. void SaveAwkTabVars()
  3169.     {
  3170.     BlockMove((Ptr)variables, (Ptr)(hs->variables), sizeof(NODE *)*HASHSIZE);
  3171.     hs->begin_block = begin_block;
  3172.     hs->end_block = end_block;
  3173.     }
  3174.  
  3175. void RestoreAwkTabVars()
  3176.     {
  3177.     BlockMove((Ptr)(hs->variables), (Ptr)variables, sizeof(NODE *)*HASHSIZE);
  3178.     begin_block = hs->begin_block;
  3179.     end_block = hs->end_block;
  3180.     }
  3181.